2016-08-26 1 views
4

많은 콩이 있으며 모두 LocalDate 및 LocalDateTime을 사용합니다. Wicket의 DateTextField와 다른 모든 위젯 (DatePicker와 같은)은 java.util.Date에서만 작동합니다. 어떤 방법으로 변환기를 Wicket 7에 삽입하여 LocalDate 또는 LocalDateTime을 사용합니까? Wicket 7을 Java 8의 java.time에서 사용하려면 어떻게해야합니까?

는 다음과 같다 :

public class SomeBean { 
    Long id = null; 
    LocalDate since = null; 
    // plus getters and setters 
} 

개찰 양식은 예를 들어, 당신은 IModel<java.util.Date>LocalDate 등 모델을 포장 할 수있는 CompoundPropertyModel

CompoundPropertyModel<SomeBean> model = new CompundPropertyModel<>(bean); 

답변

3

를 사용

public static class LocalDateModel implements IModel<java.util.Date> { 
    private IModel<LocalDate> localDateModel; 
    public LocalDateModel(IModel<LocalDate> localDateModel){ 
     this.localDateModel = localDateModel; 
    } 


    @Override 
    public Date getObject() { 
     return convertLocalDateToUtilDateSomehow(localDateModel.getObject()); 
    } 

    @Override 
    public void setObject(Date object) { 
     localDateModel.setObject(convertUtilDateToLocalDateSomehow(object)); 
    } 

    @Override 
    public void detach() { 
     localDateModel.detach(); 
    } 
} 

그런 다음 사용하려는 양식 구성 요소에 이와 같은 모델을 제공하면 정상적으로 작동합니다.

CompoundPropertyModel에 자동으로 랩핑 모델을 제공하려면 랩핑 모델이 필요하다는 것을 추론하기 위해 해당 확장 모델을 확장하고 CompoundPropertyModel#wrapOnInheritance(Component component) 메소드를 대체해야합니다. LocalDateModelButAlsoWrappingLocalDateModel 예 당연히 단지 확장뿐만 아니라 IWrapModel<T>를 구현하는

@Override 
public <C> IWrapModel<C> wrapOnInheritance(Component component) 
{ 
    IWrapModel<C> actualModel = super.wrapOnInheritance(component); 
    if (actualModel.getObject() instanceOf LocalDate) { 
     return new LocalDateModelButAlsoWrapping(actualModel); 
    } else { 
     return actualModel; 
    } 
} 

비슷 해요.

당신이 CompoundPropertyModel 일반 대신이 확장을 사용하는 경우 필드 LocalDate을하고 java.util.Date 모델처럼 보이도록 포장된다 (당신의 DateTextField 같은) 구성 요소 모델을 제공 할 때 감지 것입니다.

내가 당신에게 준 코드 스 니펫은 일반적인 메커니즘을 설명하기 위해 제공 한 것만 큼 (아마도 모델 객체를 유추해서는 안됩니다.) 그래서 당신이 직접 추론 할 것을 제안합니다. 예상되는 객체 유형 (예 : Component 인수가 DateTextField인지 확인할 수 있음) 그러나 이것은 내가 상상할 수있는 해결책의 일반적인 방향입니다.

+0

하면, 정확한 구현을하시기 바랍니다 제공 할 수 있습니까? 나는 당신의 힌트를 따르고 [이 질문] (http://stackoverflow.com/questions/42804070/java-time-localdate-and-wicket-7-datetextfield)을 만들 수 없습니다 – JimHawkins

0

당신은 당신의 자신의 변환기를 등록 할 수 있습니다 :

https://ci.apache.org/projects/wicket/guide/7.x/guide/forms2.html#forms2_3

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator defaultLocator = new ConverterLocator(); 

    defaultLocator.set(Pattern.class, new RegExpPatternConverter()); 

    return defaultLocator; 
} 

관련 : https://issues.apache.org/jira/browse/WICKET-6200

+0

맞습니다 ...그러나 DateTextField, DatePicker 등과 같은 Wicket 위젯을 사용하기위한 나의 요구 사항을 해결하지는 못합니다. –

+1

DateTextField와 비슷하게 WiseTree의 모델 래퍼가 올바른 대답입니다. – svenmeier

0

당신은 단순히 당신이이 커밋에 부착 찾을 수 개찰구 (8)에서 컨버터 클래스를 백 포트 수를 : https://issues.apache.org/jira/browse/WICKET-6200 (AbstractJavaTimeConverter 및 LocalDate, LocalDateTime, LocalTime 등에 필요한 하위 클래스)

물론 DateTextField에는 날짜 형식 매개 변수가 하드 코드되어 있으므로 도움이되지 않습니다. 예를 들어, 위의 컨버터를 사용하여 자신의 하위 클래스를 만들 수 있습니다, 또는 다음과 같이 전 세계적으로 등록 된 컨버터와 일반 레이블 및 텍스트 필드를 사용

@Override 
protected IConverterLocator newConverterLocator() { 
    ConverterLocator converterLocator = new ConverterLocator(); 
    converterLocator.set(LocalDateTime.class, new LocalDateTimeConverter()); 
    converterLocator.set(LocalDate.class, new LocalDateConverter()); 
    converterLocator.set(LocalTime.class, new LocalDateConverter()); 
    return converterLocator; 
}