Liberty Repository[8.5.5.6 或更高版本]

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;
    }
  • 在 JAX-RS 1.1 中展示为第三方 API 的 jackson 包不再展示在 JAX-RS 2.0 中。如果您要在应用程序中使用任何 org.codehaus.jackson API,您需要在应用程序中压缩 jackson 包。
  • 如果在 web.xml 文件中指定 javax.ws.rs.core.Application 作为 servlet 名称,那么 @Context 在 Application 对象中插入的 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 注释,那么一些受支持介质类型可能受到限制。请使用 isReadableisWriteable 方法来检查介质类型。例如:
    @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 中使用异步处理来处理线程。有关更多信息,请参阅异步处理
  • 展示为第三方 API 的 Wink API 都不受支持。以下列表描述不受支持的(不限于)Wink API:
    • org.apache.wink.common.model.atom.AtomEntry。在 JAX-RS 2.0 中,该 API 在 Wink 运行时响应。
    • org.apache.wink.client.handlers.BasicAuthSecurityHandler。如果要在 JAX-RS 2.0 中使用基本认证,请查看以下代码片段:
      1. 如代码示例中所示,通过 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);
            }
        }
      2. 注册至 ClientBuilder:
        ClientBuilder cb = ClientBuilder.newBuilder();
        cb.register(new BasicAuthFilter("user","password"));
    • org.apache.wink.client.handlers.LtpaAuthSecurityHandler。如果要使用基于 LTPA 的安全客户机保护下游资源,请参阅保护下游 JAX-RS 资源
    • org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper。此 API 不再受支持,因为它是 Wink 指定的 ExceptionMapper。可定义您自己的 ExceptionMapper 以映射 EJBAccessException。
    • com.ibm.websphere.jaxrs.server.IBMRestFilter。此 API 不再受支持,因为它基于 Wink 过滤器。
  • 有关可在 JAX-RS 2.0 客户机中使用的受支持客户机属性的更多信息,请参阅配置 JAX-RS 2.0 客户机
  • 如果要在 JAX-RS 2.0 中使用安全套接字层 (SSL) 功能,请执行以下步骤:
    1. 启用 ssl-1.0appSecurity-2.0 功能部件。对于 LTPA 令牌功能,appSecurity-2.0 功能部件是必需的。
      注: ssl-1.0 功能部件是 appSecurity-2.0 功能部件的子代。如果启用 jaxrsClient-2.0ssl-1.0 功能部件,那么系统自动启用 appSecurity-2.0 功能部件。
    2. 按如下所示在 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、客户机和 WebTarget 作用域。
  • 如果要在 JAX-RS 2.0 服务器运行时中使用 Wink 客户机,请执行以下步骤:
    1. 注: 如果未启用该 JAX-RS 2.0 功能部件,那么还必须下载 JAX-RS API 并将其添加至第三方库。从 https://jax-rs-spec.java.net/nonav/ 下载该 API。
    2. 将所有 JAR 文件保存到 <third-party lib> 目录中。
    3. <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> 
注: 有关在客户机和服务器 API 中进行异步处理的更多信息,请参阅 JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services(“规范”)的第 8 章。

用于指示主题类型的图标 概念主题

信息中心的条款和条件 | 反馈


时间戳记图标 最近一次更新时间: Wednesday, 2 September 2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=cwlp_jaxrs_behavior
文件名:cwlp_jaxrs_behavior.html