我正在尝试升级到Jersey 2.0,我遇到了很多麻烦,因为Jersey的groupid和artifactIds已经完全改变,我无法在Jersey文档中找到迁移计划。
我的pom.xml以前是这样的,编译后很好:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.17</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server-linking</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.17.1</version>
</dependency>
这些应该改成什么?这个无关的StackOverflow问题有点帮助,但我很难找到像@Ref
注释移动到哪里这样的东西。
更新
- 看来
@Ref
已经不存在了,或者至少在文档中没有提到了。现在你使用UriBuilder
。 - 我在文档中找到了一个非常有用的部分,它回答了我的maven问题。
-
HTTPBasicAuthFilter
已重命名为HttpBasicAuthFilter
。注意大写。 -
Client client = Client.create();
变为Client client = ClientBuilder.newClient();
:
String json = client .resource(getBaseUrl() + url) .accept(MediaType.APPLICATION_JSON_TYPE) .get(String.class);
已成为
String json = client .target(getBaseUrl()) .path(url) .request(MediaType.APPLICATION_JSON_TYPE) .get(String.class);
你没有。
Jersey 2.0缺少Jersey 1.0的很多功能。与提交者告诉你的相反,有些事情现在显然是不可能实现的(例如Guice, Spring集成)。表面上看起来一切正常,但一旦你深入挖掘,你会发现很多功能仍然是坏的。
许多的1。X插件在2中不存在。X,主要是由于上述破损。
鉴于此,我建议推迟Jersey 2。X在可预见的未来。希望提交者能在来年清理这个问题。
我不得不说这是件令人头疼的事。我们目前正忙于迁移相对较大的已有3年多历史的客户端-服务器项目,我真想把自己的脖子咬掉。希望我们已经到了斗争的终点……虽然确实有一个迁移指南,但无论如何它都不全面。
- UniformInterfaceException(和其他)不再存在。
被WebApplication异常和后继程序代替。在迁移指南中没有提到这一点,这是非常非常重要的。
- JSON支持
迁移指南说:
JSON支持在Jersey 2.x中发生了一些变化。最对于开发人员来说,明显的区别在于初始化和配置。
In Jerseyx, JAXB/JSON支持被实现为一组jersey-json模块中的MessageBodyReaders和MessageWriters。在内部,有几种JSON to Object的实现从Jersey自己的定制解决方案到第三方的映射提供商,如Jackson或Jettison。JSON的配置支持集中在JSONConfiguration和JSONJAXBContext中类。
好了。如果您选择了"Jersey的自定义解决方案"(我们出于某种原因这样做了)怎么办?在泽西岛2号没有其他选择。我尝试使用Jettison、Jackson和Moxy提供程序生成相同的JSON格式。我没有成功。作为参考,我这里没有回答的问题是:Jersey 2 JSON抛弃展开根元素
在Jersey文档中的x到2.0迁移指南。(2019链接到1.)
看起来@InjectLink
是@Ref
的替代品。
从那个链接,我可以把这个放到我的pom.xml中:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-declarative-linking</artifactId>
<version>2.6</version>
</dependency>
,然后我拿了一个现有的@Ref
,并能够用@InjectLink
替换掉。
public Long id; // This id is referenced below in the link
@InjectLink(resource = FavoriteResource.class, method = "updateFavorites", bindings = {
@Binding(name = "listId", value = "${instance.id}")
})
public URI linkURI;
看起来@Ref
中的一些JavaDocs甚至在@InjectLink
中,这将进一步确认它是替换:
/**
* ...
* @Ref(resource=SomeResource.class)
* @Ref(resource=SomeResource.class, bindings={
* @Binding(name="id" value="${instance.id}"}
* )
*/
编辑:棘手的东西。我还需要一件东西来帮我。在web.xml
中,我现在有:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.mycompany.root</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.mycompany.root.web.filter.AuditResourceFilterFactory;com.mycompany.root.web.filter.OtherAuditResourceFilterFactory</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.mycompany.root.web.resource.config.CustomResourceConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
最后,CustomResourceConfig.java
看起来像这样
import org.glassfish.jersey.linking.DeclarativeLinkingFeature;
import org.glassfish.jersey.server.ResourceConfig;
public class CustomResourceConfig extends ResourceConfig {
public CustomResourceConfig() {
packages("org.glassfish.jersey.examples.linking");
register(DeclarativeLinkingFeature.class);
}
}
您可以按照以下步骤从Jersey 1迁移到Jersey 2:
在POM文件中添加以下依赖项:Jersey 2.23.2 dependencies
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.23.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-entity-filtering</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.bundles.repackaged</groupId>
<artifactId>jersey-guava</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.23.2</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.jvnet</groupId>
<artifactId>mimepull</artifactId>
<version>1.6</version>
</dependency>
在Web.xml中创建以下条目:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.jsg.resource.initializer.RestResourceInitializer</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping> '
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/myAppName</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
在restresourceinitializer
中编写以下代码 package com.jsg.resource.initializer;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class RestResourceInitializer extends Application {
/**
* Gets the classes.
*
* @return the classes
*/
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
// Resources
classes.add(org.glassfish.jersey.jackson.JacksonFeature.class);
classes.add(org.glassfish.jersey.server.spring.scope.RequestContextFilter.class);
classes.add(org.glassfish.jersey.media.multipart.MultiPartFeature.class);
//Rest classes within Application.
classes.add(com.jsg.rest.AbcRestService.class);
classes.add(com.jsg.rest.CdeRestService.class);
return classes;
}
}
现在,如果您将上述更改的代码部署到websphere上,您将得到以下异常:
Caused by: java.lang.NoSuchMethodError: javax/ws/rs/core/Application.getProperties()Ljava/util/Map; at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:287) at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:311)
出现上述异常的原因是,Websphere支持JAX-RS 1实现,但是我们部署的是JAX-RS 2实现的Jersey 2代码。
解决上述异常的步骤:
所以基本上我们要做的是强迫WebSphere选择我们的Jersey 2 jar而不是默认的Jax-rs 1。对于
,我们需要遵循以下步骤1)通过将以下JVM属性设置为true来禁用内置JAX-RS
com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true
此属性可以通过WebSphere的管理控制台进行设置:服务器->所有服务器-> ->服务器基础设施-> Java和进程管理->进程定义->附加属性-> Java虚拟机->附加属性->自定义属性
2)创建具有Jersey 2 jar和Spring 4 jar的隔离共享库隔离共享库可以通过Websphere的管理控制台通过Environment-> shared Libraries ->New
创建在classpath框中,我们需要输入服务器上文件夹的路径,在这里我们放置了所有Jersey 2和Spring 4 jar
/var/was/server2/jerseyLib1/spring-context-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-core-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-beans-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-aop-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-web-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-expression-4.3.4.RELEASE.jar
/var/was/server2/jerseyLib1/spring-bridge-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-locator-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-api-2.5.0-b05.jar
/var/was/server2/jerseyLib1/hk2-utils-2.5.0-b05.jar
/var/was/server2/jerseyLib/javax.inject-2.5.0-b05.jar
/var/was/server2/jerseyLib1/javax.annotation-api-1.2-b03.jar
/var/was/server2/jerseyLib1/javax.ws.rs-api-2.0.1.jar
/var/was/server2/jerseyLib1/jersey-client-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-spring3-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-container-servlet-core-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-server-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-common-2.23.2.jar
/var/was/server2/jerseyLib1/jersey-guava-2.23.2.jar
同样在类加载部分,选择"为这个共享库使用一个隔离的类加载器"
,最后点击应用和确定,我们完成了隔离共享库的创建。
在管理控制台
将这个隔离的共享库与应用程序war文件绑定,如下所示a)应用程序->所有应用程序->单击您的应用程序名称b)转到References -> Shared Library References -> Reference Shared Libraries ->选择您的应用程序war(不是ear),然后单击ok。c)在左侧的"Available"组合框中选择我们在步骤2中创建的库,并将其放在右侧的"Selected"组合框中,单击"ok"。这样,我们就将隔离的共享库与应用程序war文件关联起来了。
重启服务器和应用程序应该是启动和运行。