我試圖將字符串日期(由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" />
你能告訴我在哪裏在VisitorR中定義了fieldName'startingTime' equestBaseMVVM'類? –
它不在VisitorRequestBaseMVVM中,它在VisitorRequestBase類中。但正如你所看到的,我也試圖在該類上註冊屬性編輯器.. – paroxit
你試過調試過嗎?我的意思是當你對'StringToLongPropertyEditorSupport'中的'binder.registerCustomEditor(VisitorRequestBase.class,「startingTime」,new StringToLongPropertyEditorSupport())'方法'public void setAsText(String text)'調用那個特定的fieldName? –