65장. 빈 유효성 검사
초록
빈 유효성 검사는 서비스 클래스 또는 인터페이스에 Java 주석을 추가하여 런타임 제약 조건을 정의할 수 있는 Java 표준입니다. Apache CXF는 인터셉터를 사용하여 이 기능을 웹 서비스 메서드 호출과 통합합니다.
65.1. 소개
65.1.1. 개요
빈 유효성 검사 1.1(JSR-349) - 원래 빈 유효성 검사 1.0(JSR-303) 표준으로 발전된 경우 Java 주석을 사용하여 런타임 시 확인할 수 있는 제약 조건을 선언할 수 있습니다. 주석을 사용하여 Java 코드의 다음 부분에서 제약 조건을 정의할 수 있습니다.
- 빈 클래스의 필드입니다.
- 메서드 및 생성자 매개 변수.
- 메서드 반환 값.
65.1.2. 주석이 달린 클래스의 예
다음 예제에서는 몇 가지 표준 빈 유효성 검사 제약 조건이 추가된 Java 클래스를 보여줍니다.
// Java import javax.validation.constraints.NotNull; import javax.validation.constraints.Max; import javax.validation.Valid; ... public class Person { @NotNull private String firstName; @NotNull private String lastName; @Valid @NotNull private Person boss; public @NotNull String saveItem( @Valid @NotNull Person person, @Max( 23 ) BigDecimal age ) { // ... } }
65.1.3. 빈 유효성 검사 또는 스키마 검증?
일부 면에서 빈 검증 및 스키마 검증은 매우 유사합니다. XML 스키마를 사용하여 끝점을 구성하는 것은 웹 서비스 끝점에서 런타임에 메시지를 확인하는 잘 설정된 방법입니다. XML 스키마는 들어오고 나가는 메시지에 대한 빈 유효성 검사와 동일한 제한 조건의 대부분을 확인할 수 있습니다. 그러나 빈 검증은 다음 이유 중 하나 이상에 유용한 대체가 될 수 있습니다.
- 빈 유효성 검사를 사용하면 XML 스키마와 독립적으로 제약 조건을 정의할 수 있습니다(예: 코드 우선 서비스 개발의 경우).
- 현재 XML 스키마가 너무 느릴 경우 빈 유효성 검사를 사용하여 엄격한 제약 조건을 정의할 수 있습니다.
- 빈 유효성 검사를 사용하면 XML 스키마 언어를 사용하여 정의할 수 없는 사용자 지정 제약 조건을 정의할 수 있습니다.
65.1.4. 종속 항목
Bean Validation 1.1(JSR-349) 표준에서는 구현이 아닌 API만 정의합니다. 따라서 종속성은 다음 두 부분으로 제공되어야 합니다.
- 핵심 종속 항목- 빈 검증 1.1 API, Java 통합 표현식 언어 API 및 구현을 제공합니다.
- Hibernate Validator 종속성- 빈 검증 1.1 구현을 제공합니다.
65.1.5. 핵심 종속 항목
빈 유효성 검사를 사용하려면 프로젝트의 Maven pom.xml
파일에 다음 코어 종속 항목을 추가해야 합니다.
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <!-- use 3.0-b02 version for Java 6 --> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <!-- use 3.0-b01 version for Java 6 --> <version>3.0.0</version> </dependency>
javax.el/javax.el-api
및 org.glassfish/javax.el
종속성은 Java 통합 표현식 언어의 API 및 구현을 제공합니다. 이 표현식 언어는 빈 유효성 검사를 통해 내부적으로 사용되지만 애플리케이션 프로그래밍 수준에서는 중요하지 않습니다.
65.1.6. Hibernate Validator 종속 항목
빈 유효성 검사의 Hibernate Validator 구현을 사용하려면 프로젝트의 Maven pom.xml
파일에 다음과 같은 추가 종속 항목을 추가해야 합니다.
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.3.Final</version> </dependency>
65.1.7. OSGi 환경에서 검증 공급자 해결
유효성 검사 공급자를 확인하는 기본 메커니즘에는 classpath를 검사하여 공급자 리소스를 찾아야 합니다. 그러나 OSGi(Apache Karaf) 환경의 경우 검증 공급자(예: Hibernate validator)가 별도의 번들에 패키지되어 애플리케이션 classpath에서 자동으로 사용할 수 없기 때문에 이 메커니즘이 작동하지 않습니다. OSGi의 컨텍스트에서 Hibernate 유효성 검증기를 애플리케이션 번들에 연결해야 하며, OSGi는 이를 성공적으로 수행하는 데 약간의 도움이 필요합니다.
65.1.8. OSGi에서 명시적으로 검증 공급자 구성
OSGi의 컨텍스트에서 자동 검색을 사용하지 않고 유효성 검사 공급자를 명시적으로 구성해야 합니다. 예를 들어 빈 유효성 검사를 활성화하기 위해 공통 검증 기능을 사용하는 경우 다음과 같이 검증 공급자를 사용하여 구성해야 합니다. “빈 유효성 검사 기능”
<bean id="commonValidationFeature" class="org.apache.cxf.validation.BeanValidationFeature"> <property name="provider" ref="beanValidationProvider"/> </bean> <bean id="beanValidationProvider" class="org.apache.cxf.validation.BeanValidationProvider"> <constructor-arg ref="validationProviderResolver"/> </bean> <bean id="validationProviderResolver" class="org.example.HibernateValidationProviderResolver"/>
여기서 HibernateValidationProviderResolver
는 Hibernate 검증 공급자를 래핑하는 사용자 정의 클래스입니다.
65.1.9. HibernateValidationProviderResolver 클래스의 예
다음 코드 예제에서는 Hibernate 유효성 검증기를 확인하는 사용자 지정 HibernateValidationProviderResolver
를 정의하는 방법을 보여줍니다.
// Java package org.example; import static java.util.Collections.singletonList; import org.hibernate.validator.HibernateValidator; import javax.validation.ValidationProviderResolver; import java.util.List; /** * OSGi-friendly implementation of {@code javax.validation.ValidationProviderResolver} returning * {@code org.hibernate.validator.HibernateValidator} instance. * */ public class HibernateValidationProviderResolver implements ValidationProviderResolver { @Override public List getValidationProviders() { return singletonList(new HibernateValidator()); } }
Maven 번들 플러그인을 사용하도록 구성된 Maven 빌드 시스템에서 이전 클래스를 빌드할 때 배포 시 애플리케이션이 Hibernate 검증기 번들에 연결됩니다(이미 Hibernate 유효성 검사기 번들을 이미 배포한 것으로 가정).