Jersey与Spring集成时报的错误:
java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
项目新建采用如下方式,自动生成了一些文件和配置:
pom.xml中默认会导入如下依赖包:
web.xml中会有默认servlet配置如下:
按照此方式生成的项目,将spring集成进来,导入依赖包,如下:
运行放到tomcat中能正常启动,但是访问接口时抛出异常如上所述。
问题就出现在自动生成这部分配置中,因为引入了jersey-spring的jar,内部有jersey-server/core等依赖,出现UriBuilder冲突,刚开始不知道冲突原因,后来debug发现是自动生成那两个依赖container和media都有这个东西。
解决方案:
1. 首先要将pom.xml中自动生成的这两个依赖去掉。
2. 在web.xml中自动生成的servlet换掉,使用jersey-spring中的Springservlet,下面有截图。
publish - 重启项目,就正常了。由于默认生成的可能修改时候不太注意,所以容易漏掉所以手动创建后集成spring时一定要注意!
关于集成后接口返回Json格式数据的支持:
在SpringServlet或者其父类里面找相关的配置,可以在启动时初始化的web.xml参数init-param,其中com.sun.jersey.config.property.resourceConfigClass是resourceConfig类的配置,可以自己实现,默认使用DefaultResourceConfig类作为默认配置。当需要使用json数据时,需要注册Json处理类,这时要自定义config类继承自ResourceConfig或者DefaultResourceConfig都可以,然后在web.xml中配置如下:
实现类如下:添加一个json处理类(需要引入以来包jackson相关的)
根源上是javax.ws.rs.core.UriBuilder冲突,在jersey-spring内部依赖jsr311-api的jar和jersey-container-grizzly2-http内部依赖的javax.ws.rs-api的jar冲突。它们俩都是实现UriBuilder,javax.ws.rs里面实现是UriBuilderImpl, jsr311里面的实现是JerseyUriBuilder。依赖的接口和实现不同,所以冲突。
更多:Jersey+Spring,Jersey+Spring中文
刚接触Jersey,比较粗心大意,问题遇到的或许比较低级,所以记录一下,不对的地方请指正。程序猿拜上!
Jersey-Spring集成:java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)..
最新推荐文章于 2024-07-10 18:01:03 发布