2016-06-15 6 views
1

특정 URL에 대한 요청을 처리하는 메소드가 경로 매개 변수에서 채워지는 매개 변수를 허용하는 다른 사용자가 작성한 REST API가 있습니다.dropwizard에서 사용자 정의 유효성 검사기를 사용하려면 어떻게해야합니까?

이 편지를 작성한 사람은 DropWizard를 사용했으며 이전에 작업 한 경험이 없습니다. studentId 필드를 db의 값과 비교하여 유효성을 검사하는 작업이 있습니다. 이것은 매우 간단하지만 사용자 정의 유효성 검사기를 사용하여 수행하도록 지시 받았습니다. 나는, 내가 같이 유효성 검사를 실행할 싶었 필드에 주석을 추가 한이 후

@Target(ElementType.PARAMETER) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy = StudentIdValidator.StudentIdValidation.class) 

public @interface StudentIdValidator { 

    String message() default "{Invalid Id}"; 

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

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


     class StudentIdValidation implements ConstraintValidator<StudentIdValidator, String> { 

     @Override 
     public void initialize(StudentIdValidator constraintAnnotation) { 
      System.out.println("Annotation initialize !!!!!!!!!"); 
     } 


     @Override 
     public boolean isValid(String value, ConstraintValidatorContext context)                   { 
       // TODO Auto-generated method stub 
       System.out.println("Annotation called"); 
       return false; 
      } 
     } 
    } 

, 많은 발굴이 같은 주석을 썼다 그러나 후에 작성 주석 꽤 새로운 오전

public Response processFile(@FormDataParam("sourceFile") InputStream  aStream, @PathParam("classid") String classId, @StudentIdValidator  @PathParam("studentid") String studentId, @Context HttpServletRequest  httpRequest) 

이제 문제는 내가 코드를 실행/디버깅 할 때 ...이 유효성 검사기가 호출되지 않고 studentId 유효성 검사 클래스 내에서 studentId의 값을 얻는 방법을 알지 못한다는 것입니다. 그래서 좀 더 파고 응용 프로그램 파일

class MyApplication extends Application<MyConfiguration> { 
    ........ 

    @Override 
    public void run(MyConfiguration myConfiguration, Environment      currentEnvironment) { 

    currentEnvironment.jersey().register(StudentIdValidator.class); 

    } 

내 지혜의 끝에서 그대로 오전에이 추가되었습니다. 어떤 도움도 매우 감사 할 것입니다. 잘못된 형식에 대해 죄송합니다.

답변

5

이것은 매우 간단합니다. 필자는 필자의 글을 쓰고 게으름을 피우고 싶지 않기 때문에 필자의 예제를 붙여 넣을 것이다.

편집 : 나는 당신의 리소스에 @ 유효

그래서 여기에 우리가 간다 :

당신은 검증과 올바른 궤도에 있습니다. 이 광산은 다음과 같습니다

public class CustomValidator implements ConstraintValidator<CustomValidation, String> { 

    @Override 
    public void initialize(CustomValidation constraintAnnotation) { 

    } 

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

     System.out.println("Validation called"); 

     return false; 
    } 

} 

그리고 이것은 주석입니다 :

@Constraint(validatedBy = {CustomValidator.class}) 
@Target({ElementType.FIELD, ElementType.PARAMETER}) 
@Retention(value = RetentionPolicy.RUNTIME) 
public @interface CustomValidation { 


     String message() default "Some message"; 

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

응용 프로그램 :

public class Application extends io.dropwizard.Application<Configuration>{ 

    @Override 
    public void run(Configuration configuration, Environment environment) throws Exception { 
     MetricRegistry metrics = environment.metrics(); 
     environment.jersey().register(new HelloResource(metrics)); 

    } 

    public static void main(String[] args) throws Exception { 
     new Application().run("server", "/home/artur/dev/repo/sandbox/src/main/resources/config/test.yaml"); 
    } 
} 

그리고 자원이 :

@Path("/test") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class HelloResource { 

    private MetricRegistry service; 

    public HelloResource(MetricRegistry service) { 
     this.service = service; 
    } 

    @GET 
    public String hello() { 

     Timer timer = service.timer("test"); 

     try(Context t = timer.time()) { 
      return "Hello World"; 
     } 

    } 


    @GET 
    @Path("/test2") 
    public void test(@Valid @CustomValidation @QueryParam("arg") String test) { 
     System.out.println(test); 
    } 
} 

는 신경 쓰지 마 통계와는 아무 관련이 없습니다. 중요한 부분은 DW에게 당신이 검증하기를 원하는 것을 말해야한다는 것입니다.

리소스에서 테스트 방법을 참조하십시오. @Valid (유효성 검사를 위해 DW에 알려줌) @CustomValidation (사용할 DW 유효성 검사기에게 DW)에 필요한 인수에 주석을 추가합니다.

이것은 실제로는 Dropwizard 기능이 아니라 오히려 최대 절전 유효성 검사기 구현입니다.

후드에서 작동하는 방식은 hibernate가 생성자를 호출하여 요청시 즉시 Validator 클래스를 생성한다는 것입니다. 이제는 문자열 검증과 같은 간단한 검증이 있다면 아주 잘 작동합니다. 의존성이 필요하다면 약간 더 까다로워집니다.난 당신이 여기에 읽을 수있는, 그뿐만 아니라에 대한 예제가 있습니다

With dropwizard validation, can I access the DB to insert a record

이 예는 guice를 사용하지만, 그것은 당신이 검증에 자신의 생성 메커니즘을 연결할 수 있습니다 방법을 보여줍니다. 이렇게하면 유효성 검사기 생성을 제어하고 데이터베이스에 액세스 할 수있는 데이터 소스를 삽입하거나 초기화할 수 있습니다.

나는 드롭 마법사의

아르투르

+0

및 검증에 대한 몇 가지 추가 정보를 어떻게 여기 활성화 : http://stackoverflow.com/questions/37463570/dropwizard-validate-a-field-only -on-post/37480676 # 37480676 – pandaadb

+0

답장을 보내 주셔서 감사합니다. 이 경고가 발생했습니다. org.glassfish.jersey.internal.inject.Providers가 있습니다. 공급자 com.shuvro.application.validator.StudentIdValidatior SERIES 런타임에 등록 된 StudentIdValidation은 SERVER 런타임에 적용 가능한 공급자 인터페이스를 구현하지 않습니다. 제약 조건 설정 문제 때문에 공급자 com.shuvro.application.validator.StudentIdValidator.StudentIdValidatior $ StudentIdValidation이 무시됩니다. –

+0

안녕하세요 - 유효성 검사기를 등록하지 않아도됩니다. 저지는 저지 요소가 아니므로 저지는 어떻게해야할지 모릅니다. – pandaadb

0

사용자 정의 valdation 사용자 정의 유효성 검사기를 최대 절전 모드로 동일합니다, 즉 귀하의 질문에 대한 답변 바랍니다.

링크 따라 그룹과 검증을 달성하기 hibernate validator-customconstraints

관련 문제