2012-02-28 2 views
5

JAX-RS 리소스에서 JSR303 (Bean Validation) 주석을 효과적으로 사용할 수 있습니까?JSR303에서 JAX-RS (Apache Wink) 리소스를 확인 하시겠습니까?

예를 들어, @ NotEmpty에 주석을 추가 한 리소스 멤버가있는 경우이 제약 조건이 충족되지 않으면 클라이언트에 오류가 발생합니다.

이 할 수있는 분명한 것처럼 보인다, 또한 행복

답변

3

당신은 정말 자원을 확인하는 의미합니까 (내가 ORM/데이터베이스 수준까지 검증을 이동하지 않으려는) 더 나은 방법을 이야기 할 회원? 일반적으로 JAX-RS 프레임 워크가 작동하는 한 리소스 구성원이 이러한 방식으로 또는 다른 방식으로 주입됩니다 (컨텍스트 또는 엔터티 또는 경로/쿼리/행렬 매개 변수 중 하나임).

개인적으로 나는 MessageBodyReader로 채워진 철사로 도착했기 때문에 엔티티의 유효성을 검사하는 것이 더 합리적이라고 생각합니다. 기본적으로 내부에 무엇이 있는지 전혀 모릅니다.

  1. AFAIK을, 아파치 윙크 내장 검증을 지원하지 않습니다 당신이 실체를 확인하기로 결정한 경우

    그래서, 당신이 취할 수있는 몇 가지 방법이 있습니다. 핸들러를 구현할 수 있습니다. DeploymentConfiguration.initRequestHandlersChain()을 참조하십시오. 사용자 핸들러 추가를 지원합니다. 처리기에서 모든 유효성 검사를 수행 할 수 있습니다. 이 코드를 작성하면 윙크 커뮤니티가 기뻐할 것이라고 생각합니다.
    이 접근법의 유일한 문제점은 Apache Wink에 바인딩 된 것입니다. 다른 JAX-RS 프레임 워크로 이동하기로 결정하면 작동하지 않습니다.

  2. 또 다른 접근법은 사용자 자신의 MessageBodyReader에서이 유효성 검사를 수행하는 것입니다. 엔티티에 대한 특수 판독기를 등록하고 엔티티 내부의 유효성을 검증하기 만하면됩니다. @Context Providers.getMessageBodyReader()을 사용하여 표준 MessageBodyReader (예 : JAXB 또는 Jackson)를 계속 활용할 수 있습니다. 이 접근법의 좋은 부분은 표준 JAX-RS이다. MessageBodyReaders를 설계하지 않은 용도로 사용하면 좋지 않습니다.

  3. 가장 간단한 방법은 각 리소스 메소드의 첫 번째 줄에서 엔티티의 유효성을 검사하는 것입니다. 코드 중복을 만들지 만 때로는 단순함이 이깁니다.

1

하나의 해결책 - Spring 2.5.x를 사용하고 있기 때문에 InitializingBean을 구현하고 Hibernate의 유효성 검사기에 위임하는 래퍼 클래스를 만들 수 있습니다. 그것은 작동합니다 - 더 나은 해결책이 있습니까?

+0

업데이트 - 이것은 @ Tarlog의 # 3 답변에 해당한다고 생각합니다. – Brabster

+0

사실 저는 이것을 4 번째 항목에 넣으려고 생각했지만 그만두기로 결정했습니다. 랩퍼 클래스가 자원 클래스의 주석을 가지고 있지 않을 수있는이 접근법의 문제점. 그것은 당신이 그것을 어떻게 구현하는지에 달려 있습니다. – Tarlog