2012-01-03 4 views
1

나는 모든 시간을 발생하지 않는 것 같습니다 이상한 문제로 실행 해요,하지만 그렇게되면, 그것은 다음과 같습니다프리 마커 날짜 지정은 실패

Error: on line 60, column 31 in foo/bar.ftl 
Expecting a date here, found: 2011-12-29 04:37AM 
The problematic instruction: 
---------- 
==> assignment: createDate=project.createdTime?datetime("yyyy-MM-dd hh:mma") [on line 60, column 9 in foo/bar.ftl] 
---------- 

Java backtrace for programmers: 
---------- 
freemarker.template.TemplateModelException: Error: on line 60, column 31 in foo/bar.ftl 
Expecting a date here, found: 2011-12-29 04:37AM 
    at freemarker.core.BuiltIn$dateBI$DateParser.parse(BuiltIn.java:334) 
    at freemarker.core.BuiltIn$dateBI$DateParser.get(BuiltIn.java:305) 
    at freemarker.core.BuiltIn$dateBI$DateParser.exec(BuiltIn.java:316) 
    at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:93) 
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89) 
    at freemarker.core.Assignment.accept(Assignment.java:90) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.MixedContent.accept(MixedContent.java:92) 
    at freemarker.core.Environment.visit(Environment.java:210) 
    at freemarker.core.Environment.process(Environment.java:190) 
    at freemarker.template.Template.process(Template.java:237) 
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366) 
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283) 
    at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233) 
    at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 
... 

라인에서 bar.ftl은 다음과 같습니다 실패 어디에 :

<#assign createDate = project.createdTime?datetime("yyyy-MM-dd hh:mma")> 

Project.java 코드 게터는 다음과 같습니다

private Date createdTime; 
... 
public String getCreatedTime() { 
    SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd hh:mma"); 
    return createdTime == null ? null : sm.format(createdTime); 
} 

그래서 나에게 모든 것이 올바르게 반환되고 코드가 올바르게 설정되어있는 것처럼 보입니다. 저는 FreeMarker 2.3.16과 Spring MVC를 사용하고 있습니다. 그것은 대부분의 시간 동안 작동하는 것 같지만 때로는 실패합니다 ...

아이디어?

답변

0

오류 메시지가 내부적으로, DateFormat.parsejava.text.ParseException을 던진 것을 의미한다. 예외 메시지에 주어진 문자열은 해당 패턴으로 구문 분석되어야하므로 (그리고 예제가 정확하고 실제적 이었으면 좋겠다), 가끔씩 만 발생하기 때문에 날짜 형식을 중심으로 동시성 (멀티 스레딩) 문제처럼 악취가 난다. 은닉처. 이것을 증명하는 독립 실행 형 테스트를 만들 수 있다면 더 빨리 찾을 수 있습니다 (저는 FM을 유지 관리하는 책임이 있습니다). 빨리 소스 코드를보고 나에게 아무런 변화도주지 않는다. 싱크가있다.

편집 : 또 다른 가능한 이유는 FreeMarker "로캘"설정이 영어가 아닌 경우 일 수 있습니다. "AM"/ "PM"접미사는 영어 이외의 언어와 다르므로이 오류가 발생합니다.

+0

내 예제는 정확하고 실제입니다. 제외하고 파일 이름을 각각 foo 및 bar로 바꿨습니다 ... 저는 여러분과 ChssPly76이 모두 도움이되었다고 생각합니다. 이리. 나는 그것이 아마도 동시성 문제 일 것이라고 동의한다. 반창고 솔루션이지만 ChssPly76의 제안을 따르고 파싱 패턴을 전혀 사용하지 않는 것이 좋습니다. 나는 이것이 또한 날짜 - 형식 캐시를 피할 것이라고 가정하고 있습니까? – Galen

+0

FreeMarker 버전 2.3.16을 사용 중입니다. 잠재적으로 새로운 버전으로 이전하겠습니까? – Galen

+0

'Date'를'String'으로 변환 할 때도 사용되기 때문에 날짜 형식의 캐시는 피할 수 없습니다. 그러나, 문제가'parse' 메쏘드에 특정한 것이라면, 그것을 피합니다. 이 버그 (FreeMarker 버그 인 경우)가 지금까지 알려지지 않았기 때문에 2.3.16에서 업그레이드하는 것이 도움이되지 않습니다. – ddekany

0

코드가 유효 해 보이는데, 왜 실패했는지는 잘 모르겠다. 특히 "때때로".

나를 괴롭히는 한가지는 FreeMarker 템플릿 안에서 문자열을 먼저 문자열로 변환하는 것입니다 (getCreatedTime()). 시작 날짜로 전달하지 않으시겠습니까? 같은 뭔가 :

// Project.java 
public Date getCreatedTime() { 
    return this.createdTime; 
} 

// bar.ftl 
<#assign createDate = project.createdTime?datetime> 
+0

도움 주셔서 감사합니다. 근본 원인은 실제로 내가 더 조사 할 예정인 동시성 문제입니다. – Galen

관련 문제