TomEE 8更换JAX-RS Provider遇阻:默认Johnzon换Jackson FasterXml失败
TomEE 8 替换默认JAX-RS Provider为Jackson FasterXml的解决方案
TomEE 8中CXF的配置逻辑较TomEE 7有变化,之前的系统属性配置方式会被默认配置覆盖,以下是两种可行的解决方式:
1. 先确保Jackson依赖到位
如果是Maven项目,添加依赖:
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.15.2</version> <!-- 选用最新稳定版本即可 --> <scope>compile</scope> <!-- 打包到项目war包中,或设为provided(若TomEE已内置) --> </dependency>
手动部署的话,把对应jar包放到项目WEB-INF/lib或TomEE的lib目录下。
2. 注册Jackson Provider的有效方式
方式一:通过web.xml配置
在项目WEB-INF/web.xml中指定JAX-RS Servlet并配置Provider:
<servlet> <servlet-name>JAX-RS App</servlet-name> <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> <init-param> <param-name>jaxrs.providers</param-name> <param-value>com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS App</servlet-name> <url-pattern>/api/*</url-pattern> <!-- 匹配你的API路径 --> </servlet-mapping>
方式二:通过CDI注册Provider
创建一个Producer类,将Jackson Provider作为CDI Bean注入:
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; @ApplicationScoped public class JacksonProviderProducer { @Produces public JacksonJaxbJsonProvider getJacksonProvider() { return new JacksonJaxbJsonProvider(); } }
这种方式无需修改web.xml,适合使用CDI的项目。
3. 可选:禁用默认Johnzon Provider
若要彻底排除Johnzon,可在TomEE的conf/system.properties中添加:
openejb.jaxrs.provider.johnzon=false
或者在conf/openejb.xml中配置:
<Container id="jaxrs-container" type="jaxrs"> <Property name="provider.johnzon">false</Property> </Container>
内容的提问来源于stack exchange,提问作者a.nayebi
相关产品推荐
相关产品推荐

