2017-02-23 1 views
0

bean을 나타내는 JSON 문서의 PUT을 허용하는 dropwizard 서비스가 있습니다. Bean 구현시 제약 주석을 사용하고 내 Resource 메소드에서 @Valid 주석을 사용합니다.Dropwizard 및 유효성 검사 목록

@PUT 
public Response write(@Valid MyBean bean); 

모든 것이 잘 작동합니다.

그러나 이제 배열을 JSON에 전달하고 싶습니다. 나는 단순히

@PUT 
public Response write(@Valid List<MyBean> beans); 

에 메소드 서명을 변경하고 그것은 일반적으로 작동하지만 유효성 검사 오류가있는 경우 그 반응은 매우 사용자 친화적 인 아니다. I (100) 배열의 콩 및 그 하나은 '이름'속성을 누락에 배치하는 경우, 예를 들어, 상기 응답은 상기 요청에 빈이 갖는다 의 징후없이

{"errors":["name may not be empty"]} 

인 문제.

이를 극복 할 방법이 있습니까?

내가이 모든 것을 직접 처리 할 수 ​​있도록 Resource 클래스에서 유효성 검사기를 얻는 방법이 있습니까?

답변

0

원하는 방식으로 가능하지 않을 수 있습니다.

public class ListBeanValidationTest { 

    public static void main(String[] args) { 
     List<Bean> asList = Arrays.asList(new Bean("test"), new Bean("test2")); 

     Validator v = Validators.newConfiguration().messageInterpolator(new MsgInterpolator()).buildValidatorFactory().getValidator(); 

     // this is what DW does but i am lazy so you get the main version 
     if(asList instanceof Iterable) { 
      Iterable values = (Iterable) asList; 
      Set<ConstraintViolation<Object>> violations = new HashSet<>(); 
      for(Object value : values) { 
       violations.addAll(v.validate(value)); 
      } 

      violations.forEach(System.out::println); 
     } 
    } 

    public static class Bean { 

     Bean(String name) { 
      this.name = name; 
     } 

     String name; 

     @NotEmpty(message="bean not empty ${name}") 
     String wrong; 
    } 

    public static class MsgInterpolator implements MessageInterpolator { 

     @Override 
     public String interpolate(String messageTemplate, Context context) { 
      return interpolate(messageTemplate, context, Locale.getDefault()); 
     } 

     @Override 
     public String interpolate(String messageTemplate, Context context, Locale locale) { 
      Object validatedValue = context.getValidatedValue(); 


      return null; 
     } 

    } 
} 

MessageInterpolator 여기에 문제가 : 여기 일이 어떻게 Hibernate는 당신이 그것으로 후크 할 수처럼 고원 무엇의 독립 테스트입니다. 그것은 당신을 위해 메시지를 보간 할 때 콩의 인스턴스가 없기 때문에 안타깝게도 그것에 대한 참조를 사용할 수 없습니다. 즉, 다른 방법으로이 작업을 수행해야합니다.

validator에 대한 참조를 얻을 수 있습니다 (DW 환경에서 찾을 수 있습니다.이 경우 Guice을 통해 DI를 사용합니다).

DW 작업을 수행하려는 경우 다음을 확장하여 확인할 수 있습니다. JacksonMessageBodyProvider - DW 자원에 대한 유효성 검사를 수행하는 클래스입니다. (난 그냥 내 자신을 그 일을 결국 - 아르투르

+0

감사합니다 - https://docs.jboss.org/hibernate/validator/5.1/reference/en-US/html/chapter-message-interpolation.html#section-custom-message-interpolation

:

난 그 또한 여기에 사용할 수있는 검증의 옵션을 읽을 수

도움이되기를 바랍니다 유효성 검사기를 주입하는 것이 까다로울 것이라고 생각한 이유는 확실하지 않음) –

+0

이것이 좋은 추가인지 궁금합니다. 그렇더라도 유효성 검증 메시지가 같은 bean의 다른 특성에 종속적이라면 어떻게 검증 할 것인가? 전체 Bean이 null 인 위치까지 종속성 유효성 검사를 수행하여 메시지 보 간부가 NPE가 될 시점을 확인하고 어떤 것이 유효하지 않은지를 확인합니다. 나는 그것이 이것을하지 않는 것의 동기라고 생각할 수 있습니다. 또한 Hibernate 유효성 검사는 목록이나 배열을 기본적으로 지원하지 않으므로 이것이 결코 문제가되지 않을 수도 있습니다. DW 해킹 그 자체 :) – pandaadb

관련 문제