2012-06-13 1 views
3

현재 RESTful JAX를 실험 중이며 사용자 정의 입력의 유효성을 검사하고 싶습니다. 일반적으로 정규 표현은 괜찮지 만 좀 더 포괄적 인 검사 (~ 10 개의 다른 정규식 패턴)가 필요합니다. jaxrs 유효성 검사를 검색 할 때 this page을 찾았습니다. 나는 그것이 "초안"이라고 말했지만 나는 그것을 시도해 볼 것이라고 생각했다.JAX-RS 커스텀 pathparam 유효성 검사기

@Target(ElementType.PARAMETER) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = FooBarValidator.class) 
public @interface FooBarParam 
{ 
} 

유효성 검사기는 다음과 같습니다 :

@Provider 
public class FooBarValidator 
     implements ConstraintValidator<FooBar, Long> 
{ 
    @Override 
    public void initialize(FooBar constraintAnnotation) 
    { 
    } 

    @Override 
    public boolean isValid(Long value, ConstraintValidatorContext context) 
    { 
     // validation goes here, this is a test validation 
     return (value > 50); 
    } 
} 

웹 서비스는 다음과 같습니다

@javax.ejb.Stateless 
@Path("test") 
public class testRS 
{ 
    @GET 
    @Path("foobar/{fooBar: [0-9]+}") 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.TEXT_PLAIN) 
    public String testService(@FooBar @PathParam("fooBar") Long fooBar) 
    { 
     return "tested with: " + fooBar; 
    } 
} 

을하지만 호출하는 경우

는이 같은 내 매개 변수의 주석을 썼다 내 웹 서비스 "http : // localhost : 8080/jaxtest/rest/test/foobar/11"을 사용하여 내 브라우저에서 웹 서비스 e가 호출되고 "with with tested : 11"이라고 표시됩니다. 유효성 검사기가 호출되지 않는다는 점을 제외하고는 웹 서비스가 정상적으로 작동합니다.

유효성 검사기 클래스와 주석 인터페이스에 중단 점을 설정하려고 시도했지만 아무 것도 충돌하지 않았습니다.

참조 된 문서의 '초안'헤더 때문에 내가 할 수없는 일을하고 있다는 몰래 의심 스럽습니다. 그래서 내가 뭔가 잘못하고 있거나 대안이 있다면, 나는 그것을 듣게되어 기쁩니다.

+1

당신은 콩 검증 (JSR 303) http://docs.jboss.org/seam/3/rest/latest/reference/en-US/html와 esily JAX-RS를 통합 할 수 /rest.validation.html –

답변

2

힌트 @ PiotrKochański 덕분에 성공적으로 을 구현했습니다. 정확히을 원했습니다. 가장 큰 문제는 글래스 피쉬 사용에 구속된다는 것입니다. 기본적으로 Glassfish는 Jersey를 사용하여 JAX를 처리합니다.

이 작업을 완료하는 데 10 시간 이상이 걸렸으므로이 작업을 수행하는 데 시간을 절약하십시오.

우선 은 Maven을 사용합니다. 이렇게하면 삶이 훨씬 쉬워집니다.

두 번째 단계,

<!-- Needed for validator interceptors --> 
<dependency> 
    <groupId>org.jboss.seam.rest</groupId> 
    <artifactId>seam-rest</artifactId> 
    <version>3.1.0.Final</version> 
</dependency> 
<!-- JBoss' RS implementation --> 
<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxrs</artifactId> 
    <version>2.3.4.Final</version> 
</dependency> 
<!-- Because I use JSON I need RESTeasy be able to handle this --> 
<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jettison-provider</artifactId> 
    <version>2.3.4.Final</version> 
</dependency> 
<!-- This is THE part that integrates validation in RESTeasy --> 
<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-hibernatevalidator-provider</artifactId> 
    <version>2.3.4.Final</version> 
</dependency> 

마지막 의존성의 pom.xml에 종속성을 추가, 당신의 pom.xml에

<repositories> 
    <repository> 
     <id>jboss-public-repository-group</id> 
     <name>JBoss Public Maven Repository Group</name> 
     <url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url> 
     <layout>default</layout> 
     <releases> 
      <enabled>true</enabled> 
      <updatePolicy>never</updatePolicy> 
     </releases> 
     <snapshots> 
      <enabled>true</enabled> 
      <updatePolicy>never</updatePolicy> 
     </snapshots> 
    </repository> 
</repositories> 

세 번째 단계는 JBoss의 repo를 추가 나에게 꽤했다. The docs @PiotrKochański pointed to이 언급하지 않았다. 그러나 another version of the docs에 내가 이걸 발견 :

API를 구현하고 RESTEasy가이 RESTEasy가-hibernatevalidator 바이더 구성 요소를 통해 이루어집니다 사이의 통합. 통합하려면 resteasy-hibernatevalidator-provider 및 hibernate-validator를 클래스 경로에 추가해야합니다.

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-hibernatevalidator-provider</artifactId> 
    <version>2.3-RC1</version> 
</dependency> 

네 번째 단계는 다섯 번째 단계는 같은 웹 서비스 클래스를 수정했다이

<context-param> 
    <param-name>resteasy.scan</param-name> 
    <param-value>true</param-value> 
</context-param> 
<context-param> 
    <param-name>resteasy.servlet.mapping.prefix</param-name> 
    <param-value>/rest</param-value> 
</context-param> 
<listener> 
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
</listener> 
<servlet> 
    <servlet-name>REST Service</servlet-name> 
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

web.xml에에 추가했다 : 받는다는으로 다음과 같은 의존성을 포함하여 단지 문제 이 :

: 여섯 번째 단계는이에 @interface을 수정했다
@javax.ejb.Stateless 
@Path("test") 
public class testRS 
{ 
    @GET 
    @Path("foobar/{fooBar}") 
    @Produces(MediaType.APPLICATION_JSON) 
    @org.jboss.resteasy.spi.validation.ValidateRequest 
    public String testService(@FooBar @PathParam("fooBar") Long fooBar) 
    { 
     return "tested with: " + fooBar; 
    } 
} 

보너스로 또한
@Target(ElementType.PARAMETER) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = FooBarValidator.class) 
public @interface FooBarParam 
{ 
    String message() default "{constraint.FooBar}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

; 나는 건너 갔다 a presentation about Bean Validation by Emmanuel Bernard 나는 이것이 많은 흥미있는 재료를 설명하는 것에 따라 내가 공유 할지도 모른다라고 생각했다. 당신이 RESTEasy가 JAX-RS 구현을 사용하는 경우

+0

왜 downvote? – siebz0r

0

찾은 페이지는 JAX-RS 2.0으로 들어가야 할 것에 대한 제안 중 하나입니다 (최종적이지 않으며 구현이 없습니다). 이 계획은 JAX-RS 2.0이 Bean Validation과 통합 될 계획이지만, 아직까지는 구현되지 않았습니다.

현재 입력의 유효성을 검사하려면 매개 변수를 Long (Long 대신)으로 선언하고 유효성 검사를 리소스 메서드의 일부로 수행 할 수 있습니다. 그런 다음 유효성 검사가 통과되면 Long으로 변환하십시오.