2017-01-24 6 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()Unknown property 'startDate'과 함께 java.lang.NoSuchMethodException을 던지고 있습니다.

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) 

그러나 startDateMyClass에있다. 변수는 public이고 이름은 camel case입니다. 왜 문제가 발생하고 있습니까? 어떤 생각?

+0

전체 예외 사항 표시! – Strelok

+0

'OfferCreationREST'는'MyClass'의 진짜 이름인가요? 아니면 실제로 앱 내에서 다른 클래스입니까? – luboskrnac

+0

네, 맞습니다. 나는 그 질문을 편집하고있다. –

답변

1

해결책을 찾았습니다. 나는 단지 내 MyClass의 getters를 써야만했다. 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; 
    } 
}