【发布时间】:2024-01-05 20:22:01
【问题描述】:
我有一个应用程序,它具有使用 Jersey 和 Jackson 作为 JSON 提供程序构建的 Web 服务,所有这些都在 Tomcat 应用程序服务器中。
我需要让这个应用程序在 Wildfly 10 上运行,并且一切正常,除了没有考虑 Jackson 注释的 web 服务响应。根据我的阅读,Wildfly 默认使用 Jettison,而在较新的版本中使用的是 Jackson2。
首选的解决方案是让 RestEasy(来自 Wildfly 10)使用 Jackson,为此我尝试排除 Jackson2 和 Jettison,并在 (META-INF\jboss-deployment-structure.xml) 中对 Jackson 建立依赖关系,如下:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<exclusions>
<module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
<module name="org.jboss.resteasy.resteasy-jettison-provider"/>
</exclusions>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jackson-provider" services="import"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
显然这还不够,因为它的行为与以前一样。 我还应该尝试什么?
更新:
由于我的应用程序在 Tomcat(使用 Jersey)和 Wildfly(使用 RestEasy)上的工作方式应该相同,因此我不能依赖在我的应用程序中使用来自 resteasy 的 jackson,因此我正在导入 org.codehaus.jackson。
所以,我这样注册我的应用程序:
import javax.ws.rs.core.Application;
public class RestApplication extends Application
{
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(RestObjectMapperProvider.class);
classes.add(GeneratedService.class);
return classes;
}
}
其余对象映射器提供者:
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
@Provider
public class RestObjectMapperProvider implements ContextResolver<ObjectMapper>
{
private final ObjectMapper objectMapper;
public RestObjectMapperProvider()
{
this.objectMapper = new ObjectMapper();
this.objectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
}
@Override
public ObjectMapper getContext(Class<?> type)
{
return this.objectMapper;
}
}
我正在使用 Gradle 构建我的应用程序,下面是 Jackson 依赖项:
compile group: 'org.codehaus.jackson', name: 'jackson-jaxrs', version: '1.9.+'
由于在 Tomcat (Jersey) 下考虑了注释,我的猜测是在 Wildfly 中我的排除不被考虑。除了检查响应之外,还有什么方法可以检查考虑了哪个 JSON Provider?
【问题讨论】:
-
您是继续使用 Jersey 还是打算使用 Jax-RS/Resteasy?
标签: rest jackson jax-rs wildfly resteasy