2017-01-24 40 views
0

這是我的課程。使用BeanUtils.getProperty時出現未知屬性錯誤()

@DateRange.List({ 
     @DateRange(start = "startDate", end = "endDate", message = "Start date should be earlier than end date.") 
}) 
public class MyClass { 
    @NotNull 
    @Pattern(regexp = DateConstants.DATE_FORMAT_REGEX, message = "Invalid date format.") 
    public String startDate; 

    @NotNull 
    @Pattern(regexp = DateConstants.DATE_FORMAT_REGEX, message = "Invalid date format.") 
    public String endDate; 
} 

我添加了一個@DateRange註釋,其聲明如下。

@Target({TYPE, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = DateRangeValidator.class) 
@Documented 
public @interface DateRange { 
    String message() default "{constraints.daterange}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    String start(); 

    String end(); 

    @Target({TYPE, ANNOTATION_TYPE}) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List { 
     DateRange[] value(); 
    } 
} 

和驗證器類是

public class DateRangeValidator implements ConstraintValidator<DateRange, Object> { 
    private String startDateFieldName; 
    private String endDateFieldName; 

    @Override 
    public void initialize(final DateRange constraintAnnotation) { 
     startDateFieldName = constraintAnnotation.start(); 
     endDateFieldName = constraintAnnotation.end(); 
    } 

    @Override 
    public boolean isValid(final Object value, final ConstraintValidatorContext context) { 

     final String startDate = (String) BeanUtils.getProperty(value, startDateFieldName); 
     final String endDate = (String) BeanUtils.getProperty(value, endDateFieldName); 

     return isValidDateRange(startDate, endDate); 
    } 

    private boolean isValidDateRange(String start, String end) { 
     DateFormat dateFormat = new SimpleDateFormat(DateConstants.DATE_FORMAT); 
     try { 
      Date startDate = dateFormat.parse(start); 
      Date endDate = dateFormat.parse(end); 

      if (startDate.before(endDate)) return true; 
     } catch (ParseException e) {} 

     return false; 
    } 
} 

的驗證檢查的開始日期是早於結束日期。

在這樣做的同時,BeanUtils.getProperty()正在拋出java.lang.NoSuchMethodException以及Unknown property 'startDate'

java.lang.NoSuchMethodException: Unknown property 'startDate' on class 'class mypackage.domain.rest.MyClass' 
    at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(PropertyUtilsBean.java:1322) 
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:770) 
    at org.apache.commons.beanutils.BeanUtilsBean.getNestedProperty(BeanUtilsBean.java:715) 
    at org.apache.commons.beanutils.BeanUtilsBean.getProperty(BeanUtilsBean.java:741) 
    at org.apache.commons.beanutils.BeanUtils.getProperty(BeanUtils.java:382) 
    at bd.com.ipay.offer.validation.imp.DateRangeValidator.isValid(DateRangeValidator.java:36) 
    at org.hibernate.validator.engine.ConstraintTree.validateSingleConstraint(ConstraintTree.java:278) 
    at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:153) 
    at org.hibernate.validator.engine.ConstraintTree.validateConstraints(ConstraintTree.java:117) 
    at org.hibernate.validator.metadata.MetaConstraint.validateConstraint(MetaConstraint.java:84) 
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:452) 
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:397) 
    at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:361) 
    at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:313) 
    at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:139) 
    at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:108) 
    at org.springframework.validation.DataBinder.validate(DataBinder.java:866) 
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.validateIfApplicable(AbstractMessageConverterMethodArgumentResolver.java:268) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:99) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128) 

startDate有在MyClass。該變量是公開的,並命名爲camel case。爲什麼問題在發生?任何想法?

+0

顯示完整例外! – Strelok

+0

「OfferCreationREST」是「MyClass」的真實名稱,還是實際上是您的應用程序中的不同類? – luboskrnac

+0

是的,沒錯。我在編輯這個問題。 –

回答

1

我找到了解決方案。我只需要寫我的MyClass的獲得者。似乎沒有找到屬性,因爲沒有getter函數。

所以最終MyClass看起來像。

@DateRange.List({ 
     @DateRange(start = "startDate", end = "endDate", message = "Start date should be earlier than end date.") 
}) 
public class MyClass { 
    @NotNull 
    @Pattern(regexp = DateConstants.DATE_FORMAT_REGEX, message = "Invalid date format.") 
    public String startDate; 

    @NotNull 
    @Pattern(regexp = DateConstants.DATE_FORMAT_REGEX, message = "Invalid date format.") 
    public String endDate; 

    public String getStartDate() { 
     return startDate; 
    } 

    public String getEndDate() { 
     return endDate; 
    } 
}