JAX-RS 2.0 동작 변경사항
JAX-RS 2.0 구현에는 일부 동작 변경사항이 포함됩니다. 이 변경사항으로 인해, 애플리케이션이 JAX-RS 1.1에서 업그레이드된 경우 애플리케이션이 JAX-RS 2.0에서 다르게 작동하거나 실패할 수 있습니다.
다음 목록에는 JAX-RS 1.1과 JAX-RS 2.0의 차이점이 설명되어 있습니다.
- JAX-RS 1.1 및 Jersey에서 EJB 또는 CDI 클래스가 JAX-RS application.getSingletons() 메소드가 리턴하는
새 인스턴스를 작성하는 경우 엔진은 리턴된 인스턴스를 사용하며 EJB 또는 CDI 컨테이너의 인스턴스에 대한 액세스를
시도하지 않습니다. JAX-RS 2.0에서는 같은 시나리오에서
엔진이 EJB 또는 CDI 컨테이너의 인스턴스에 액세스하려 시도합니다. 이 인스턴스에 액세스할 수 있는 경우에는
검색된 인스턴스가 사용됩니다.
그러나 인스턴스에 액세스할 수 없는 경우에는 getSingletons() 메소드에서 리턴된 인스턴스가 사용됩니다. 예를 들면 다음과 같은 경우가 있습니다.
@Override public SetObject getSingletons() { SetObject objs = new HashSetObject(); objs.add(new CDIInjectResource()); objs.add(new EJBInjectResource()); return objs; }
MultiPart 파일을 처리할 때 JAX-RS 2.0에는 다수의 API 변경사항이 포함됩니다. 예를 들어, JAX-RS 1.1에서는 @FormParam을 사용하여 MultiPart 파일을 처리할 수 있지만 JAX-RS 2.0에서는 @IMultipartBody 또는 @IAttachment만을 사용하여 MultiPart 파일을 처리할 수 있습니다. 자세한 정보는 JAX-RS 2.0의 HTML 양식 제출에서 multipart/form-data 파트를 수신하도록 자원 구성의 내용을 참조하십시오.
- JAX-RS 1.1에서 써드파티 API로 표시되는 jackson 패키지가 JAX-RS 2.0에서는 더 이상 표시되지 않습니다. 애플리케이션에서 org.codehaus.jackson API를 사용하려는 경우에는 애플리케이션 내에 jackson 패키지를 압축해야 합니다.
- web.xml 파일에 서블릿 이름의 javax.ws.rs.core.Application을
지정하는 경우에는 @Context에 의해 삽입되는 애플리케이션 오브젝트의
getClasses 메소드가 자원 클래스를 리턴하지 않습니다.
<servlet> <servlet-name>javax.ws.rs.core.Application</servlet-name> </servlet> <servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
- JAX-RS 2.0 스펙에 따르면 제공자는 하나 이상의 JAX-RS 인터페이스를 구현하며 자동 발견을 위해 @Provider로 어노테이션이 지정될 수 있는 클래스입니다.
이 시나리오에서 클래스에는 제공자 인터페이스를 참조하는 @Local 어노테이션이 있지만,
이는 POJO 제공자 인터페이스를 구현하지 않으며 이는 올바르지 않은 제공자입니다. 예를 들면 다음과 같은 경우가 있습니다.
@Stateless @Local(OneLocalInterfaceMyOtherStuffMessageBodyWriter.class) public class OneLocalInterfaceMyOtherStuffProvide
- MessageBodyReader 및 MessageBodyWriter @Consumes, @Produces 어노테이션을 사용하는 경우에는 일부 지원되는 매체 유형이 제한될 수 있습니다.
isReadable 메소드 또는 isWriteable 메소드를 사용하여 매체 유형을 확인하십시오. 예를 들면 다음과 같은 경우가 있습니다.
@Provider @Consumes("<custom/type>") @Produces("<custom/type>") @Singleton public class MyMessageBodyReaderAndWriter implements MessageBodyReader,MessageBodyWriter { public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { if (mediaType.toString().equals("<custom/type>")) return true; return false; } public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { if (mediaType.toString().equals("<custom/type>")) return true; return false; } ... }
- JAX-RS 2.0에서는 스레드를 처리하는 데 비동기 처리를 사용할 수 있습니다. 자세한 정보는 비동기 처리의 내용을 참조하십시오.
- JAX-RS 1.1에서 써드파티 API로 표시되는 어떤 Wink API도 JAX-RS 2.0에서 지원되지 않습니다. 일부 목록은 다음과 같습니다.
- org.apache.wink.common.model.atom.AtomEntry. JAX-RS 2.0과 Atom의 통합에 대한 자세한 정보는 Atom과 JAX-RS 2.0 통합의 내용을 참조하십시오.
- org.apache.wink.client.handlers.BasicAuthSecurityHandler. JAX-RS 2.0에서 기본 인증을 사용하려는 경우에는 다음 코드 스니펫을 참조하십시오.
- 다음 코드 예제에 표시되어 있는 바와 같이 JAX-RS 2.0 표준 클라이언트 API를 통해 ClientRequestFilter를 사용하십시오.
import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.ws.rs.client.ClientRequestContext; import javax.ws.rs.client.ClientRequestFilter; import javax.ws.rs.core.MultivaluedMap; import javax.xml.bind.DatatypeConverter; public class BasicAuthFilter implements ClientRequestFilter { private final String usr; private final String pwd; public BasicAuthFilter(String usr, String pwd) { this.usr = user; this.pwd = pwd; } public void filter(ClientRequestContext requestContext) throws IOException { MultivaluedMap<String, Object> headers = requestContext.getHeaders(); String token = this.usr + ":" + this.pwd; final String basicAuthentication ="Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8")); headers.add("Authorization", basicAuthentication); } }
- ClientBuilder에 등록하십시오.
ClientBuilder cb = ClientBuilder.newBuilder(); cb.register(new BasicAuthFilter("user","password"));
- 다음 코드 예제에 표시되어 있는 바와 같이 JAX-RS 2.0 표준 클라이언트 API를 통해 ClientRequestFilter를 사용하십시오.
- org.apache.wink.client.handlers.LtpaAuthSecurityHandler. LTPA 기반 보안 클라이언트를 사용하여 다운스트림 자원에 보안을 설정하려면 다운스트림 JAX-RS 자원 보안의 내용을 참조하십시오.
- org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper. 이 API는 Wink 고유의 ExceptionMapper이므로 더 이상 지원되지 않습니다. 사용자는 EJBAccessException을 맵핑하기 위해 자신의 ExceptionMapper를 정의할 수 있습니다.
- com.ibm.websphere.jaxrs.server.IBMRestFilter. 이 API는 Wink 필터를 기반으로 하므로 더 이상 지원되지 않습니다.
참고:애플리케이션에 wink jar 패키지가 있는지 여부를 찾으십시오. 애플리케이션에 wink 패키지가 있으면 다음 단계를 수행해야 합니다.
- 애플리케이션 서브클래스가 정의되어 있는지 확인하십시오.
- 최소한 getClasses 및 getSingletons 중 하나는 널이어야 합니다.
- JAX-RS 2.0 클라이언트에서 사용할 수 있는 지원되는 클라이언트 특성에 대한 자세한 정보는 JAX-RS 2.0 클라이언트 구성을 참조하십시오.
- JAX-RS 2.0에서 SSL(Secure Sockets Layer) 기능을 사용하려면 다음 단계를 수행하십시오.
- ssl-1.0 기능이나 appSecurity-2.0 기능 중 하나를 사용하십시오. LTPA 토큰 기능의 경우에는 appSecurity-2.0 기능이 필요합니다.
참고: ssl-1.0 기능은 appSecurity-2.0 기능의 하위 기능입니다. jaxrsClient-2.0 기능과 ssl-1.0 기능을 사용하면 appSecurity-2.0 기능이 자동으로 사용됩니다.
- JAX-RS 2.0 클라이언트 코드에서 com.ibm.ws.jaxrs.client.ssl.config 특성을 다음과 같이 사용으로 설정하십시오.
ClientBuilder cb = ClientBuilder.newBuilder(); Client c = cb.build(); c.property("com.ibm.ws.jaxrs.client.ssl.config", "mySSLConfig"); //mySSLConfig is the ssl ref id in Liberty server.xml
참고: 이 특성은 Liberty SSL 구성을 ClientBuilder, Client 및 WebTarget의 범위에 바인드할 수 있습니다.
- ssl-1.0 기능이나 appSecurity-2.0 기능 중 하나를 사용하십시오. LTPA 토큰 기능의 경우에는 appSecurity-2.0 기능이 필요합니다.
- JAX-RS 2.0 서버 런타임에서 Wink 클라이언트를 사용하려면 다음 단계를 수행하십시오.
- JAX-RS 2.0 서버 런타임에서 Wink 클라이언트를 사용할 수 있는 다음 파일을 다운로드하십시오.
- http://wink.apache.org/downloads.html에서 Apache Wink 및 관련 JAR 파일을 다운로드하십시오.
- http://hc.apache.org/에서 Apache HTTP 및 관련 JAR 파일을 다운로드하십시오.
참고: JAX-RS 2.0 기능이 사용으로 설정되지 않은 경우에는 JAX-RS API를 다운로드하여 third-party lib 디렉토리에 추가해야 합니다. https://jax-rs-spec.java.net/nonav/에서 JAX-RS API를 다운로드하십시오. - 모든 JAR 파일을 <third-party lib> 디렉토리에 저장하십시오.
- 다음과 같이 <third-party lib>의 위치를 server.xml 파일에 추가하십시오.
<library id="thirdPartyLib"> <fileset dir=" <third-party lib>" includes="*.jar" scanInterval="5s"/> </library> <enterpriseApplication id="<Your Ear ID>" location="<Your Ear Name>" name="<Your Ear Name>"> <classloader commonLibraryRef="thirdPartyLib"/> </enterpriseApplication>
- JAX-RS 2.0 서버 런타임에서 Wink 클라이언트를 사용할 수 있는 다음 파일을 다운로드하십시오.
참고: 클라이언트 및 서버 API에서의 비동기 처리에 대한 자세한 정보는
JSR 339: JAX-RS 2.0: Java API for RESTful Web Services("스펙")의
8장을 참조하십시오.