2015-07-28 102 views
0

我試圖將字符串日期(由html論壇提交)轉換爲Long類型(時間戳)。據我瞭解,我必須做的是創建一個自定義PropertyEditor,我做到了。複雜類型的Spring MVC PropertyEditorSupport

我也使用@Valid註釋和一個自定義的Validator類來進行綁定。儘管我已經註冊了我的PropertyEditor和Validator,但PropertyEditor無法工作。

據控制檯輸出,驗證踢和嘗試驗證對象,當它發現的時間字符串不長,它增加了「typeMismatch」錯誤的錯誤對象...

上午我做錯了什麼?

下面是類:

Controller類

@InitBinder 
public void initBinder(WebDataBinder binder) 
{ 
    binder.registerCustomEditor(VisitorRequestBaseMVVM.class,"startingTime",new StringToLongPropertyEditorSupport()); 
    //I also have tried this... 
    //binder.registerCustomEditor(VisitorRequestBase.class,"startingTime",new StringToLongPropertyEditorSupport()); 


@RequestMapping(value="/create-request",method=RequestMethod.POST) 
public ModelAndView postCreateRequest(@ModelAttribute("command") @Valid VisitorRequestBaseMVVM model, 
     BindingResult result) 
{ 
    ModelAndView modelAndView = new ModelAndView("create-request-first-step"); 

    // For to see output of all errors  
    for(ObjectError error : result.getAllErrors()) 
    { 
     System.out.println(error.getObjectName() + ":" + error.getCode() + ":" + error.getDefaultMessage()); 
    } 


    VisitorRequestBaseMVVM mvvm = new VisitorRequestBaseMVVM(); 
    mvvm.setVisitorRequestBase(new VisitorRequestBase()); 
    mvvm.setAllVisitorRequestTypes(allVisitorRequestTypes()); 

    modelAndView.addObject("command",mvvm); 

    return modelAndView; 
} 

    binder.addValidators(new VisitorRequestBaseMVVMValidatorImpl()); 
} 

StringToLongPropertyEditorSupport.java

public class StringToLongPropertyEditorSupport extends 
     PropertyEditorSupport { 

    @Override 
    public void setAsText(String text) { 
     System.out.println("Has it come to this ? (StringToDateTimePropertyEditorSupport):" + text); 
     setValue(DateTime.parse(text).getMillis()); 
    } 
} 

VisitorRequestBase.java

public class VisitorRequestBase extends BaseEntity{ 
private long startingTime; 
private long endingTime; 
private String note; 
private boolean isCompleted; 

@Enumerated(EnumType.STRING) 
private ApprovalState approvalState; 

@OneToOne 
private User user; 

private List<ApprovalHistory> approvalHistories; 

public long getStartingTime() { 
    return startingTime; 
} 
public void setStartingTime(long startingTime) { 
    this.startingTime = startingTime; 
} 
public long getEndingTime() { 
    return endingTime; 
} 
public void setEndingTime(long endingTime) { 
    this.endingTime = endingTime; 
} 
public String getNote() { 
    return note; 
} 
public void setNote(String note) { 
    this.note = note; 
} 
public ApprovalState getApprovalState() { 
    return approvalState; 
} 
public void setApprovalState(ApprovalState approvalState) { 
    this.approvalState = approvalState; 
} 
public User getUser() { 
    return user; 
} 
public void setUser(User user) { 
    this.user = user; 
} 
public List<ApprovalHistory> getApprovalHistories() { 
    return approvalHistories; 
} 
public void setApprovalHistories(List<ApprovalHistory> approvalHistories) { 
    this.approvalHistories = approvalHistories; 
} 
public boolean isCompleted() { 
    return isCompleted; 
} 
public void setCompleted(boolean isCompleted) { 
    this.isCompleted = isCompleted; 
} 


public void setPropertiesForSubclass(final VisitorRequestBase subObject) 
     throws IllegalArgumentException, IllegalAccessException 
{ 
    for(Field field : VisitorRequestBase.class.getFields()) 
    { 
     field.set(subObject, field.get(this)); 
    } 
} 

} 

VisitorRequestBaseValidator.java

@Component 
public class VisitorRequestBaseValidatorImpl implements VisitorRequestBaseValidator { 

@Override 
public boolean supports(Class<?> arg0) { 
    return VisitorRequestBase.class.isAssignableFrom(arg0); 
} 

@Override 
public void validate(Object objectToValidate, Errors errors) { 

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "startingTime","validation.createRequest.startingTime.empty"); 
} 

} 

VisitorRequestBaseMVVM.java

public class VisitorRequestBaseMVVM { 
private VisitorRequestBase visitorRequestBase; 
private VisitorRequestType visitorRequestType; 

private List<VisitorRequestType> allVisitorRequestTypes; 

public VisitorRequestBase getVisitorRequestBase() { 
    return visitorRequestBase; 
} 
public void setVisitorRequestBase(VisitorRequestBase visitorRequestBase) { 
    this.visitorRequestBase = visitorRequestBase; 
} 
public VisitorRequestType getVisitorRequestType() { 
    return visitorRequestType; 
} 
public void setVisitorRequestType(VisitorRequestType visitorRequestType) { 
    this.visitorRequestType = visitorRequestType; 
} 
public List<VisitorRequestType> getAllVisitorRequestTypes() { 
    return allVisitorRequestTypes; 
} 
public void setAllVisitorRequestTypes(List<VisitorRequestType> allVisitorRequestTypes) { 
    this.allVisitorRequestTypes = allVisitorRequestTypes; 
} 


} 

VisitorRequestBaseMVVMValidatorImpl.java

@Component 
public class VisitorRequestBaseMVVMValidatorImpl implements VisitorRequestBaseMVVMValidator{ 


@Autowired 
private VisitorRequestBaseValidator visitorRequestBaseValidator; 

@Override 
public boolean supports(Class<?> clazz) { 
    return VisitorRequestBaseMVVM.class.isAssignableFrom(clazz); 
} 

@Override 
public void validate(Object target, Errors errors) { 
    VisitorRequestBaseMVVM object = (VisitorRequestBaseMVVM)target; 


    if(object.getVisitorRequestType() == null) 
     errors.rejectValue("visitorRequestType", "validation.createRequest.visitorRequestType.notSelected"); 


    errors.pushNestedPath("visitorRequestBase"); 
    ValidationUtils.invokeValidator(visitorRequestBaseValidator,object.getVisitorRequestBase(), errors); 
    errors.popNestedPath(); 

} 

} 

UPDATE

這些更改後,我可以字符串轉換爲長

  • 我已經改變了基本類型long引用鍵入龍在VisitorRequestBase
  • 我已經創建Converter並通過此代碼註冊到應用程序的上下文中。

    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
         <property name="converters"> 
          <list> 
           <bean class="com.test.mvvm.converters.StringToLongConverter"/> 
          </list> 
         </property> 
        </bean> 
    
    
        <mvc:annotation-driven conversion-service="conversionService" /> 
    
+0

你能告訴我在哪裏在VisitorR中定義了fieldName'startingTime' equestBaseMVVM'類? –

+0

它不在VisitorRequestBaseMVVM中,它在VisitorRequestBase類中。但正如你所看到的,我也試圖在該類上註冊屬性編輯器.. – paroxit

+0

你試過調試過嗎?我的意思是當你對'StringToLongPropertyEditorSupport'中的'binder.registerCustomEditor(VisitorRequestBase.class,「startingTime」,new StringToLongPropertyEditorSupport())'方法'public void setAsText(String text)'調用那個特定的fieldName? –

回答

0

變化

binder.registerCustomEditor(VisitorRequestBaseMVVM.class,"startingTime",new StringToLongPropertyEditorSupport()); 

binder.registerCustomEditor(VisitorRequestBaseMVVM.class,"visitorRequestBase.startingTime",new StringToLongPropertyEditorSupport()); 

沒有對VisitorRequestBaseMVVM沒有實地startingTime,所以指定該字段的嵌套路徑

+0

我也試過了。不工作 – paroxit