gpt4 book ai didi

rest - 配置 Wildfly 10 以使用 Jackson(作为 JSON 提供程序)

转载 作者:行者123 更新时间:2023-12-04 12:05:01 25 4
gpt4 key购买 nike

我有一个应用程序,它具有使用 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 提供程序?

最佳答案

我很好奇你为什么使用 Jackson 1.x 而不是 2.x?两者的说明相似,但必须更改 Jackson 配置。以下是 1.x 的说明。

jboss-deployment-structure.xml(和你的一样):

<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>

使用@Application 注册您的应用程序:

@ApplicationPath("/api/v1")
public class V1Application extends Application {

@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();

classes.add(JacksonConfigurationProvider.class);
classes.add(TestResource.class);

return classes;
}

}

使用 jackson 配置提供程序,例如:

@Provider
@Consumes({MediaType.APPLICATION_JSON, "text/json"})
@Produces({MediaType.APPLICATION_JSON, "text/json"})
public class JacksonConfigurationProvider extends ResteasyJacksonProvider {

private static final Logger LOGGER = LoggerFactory.getLogger(JacksonConfigurationProvider.class);

public JacksonConfigurationProvider() {
super();

LOGGER.info("loading jackson configurator");

JacksonObjectMapper mapper = JacksonObjectMapper.get();
setMapper(mapper);

}
}

然后,在您的 JacksonObjectMapper 中,您告诉它读取注释:

public class JacksonObjectMapper extends ObjectMapper {
public static JacksonObjectMapper get() {
JacksonObjectMapper mapper = new JacksonObjectMapper();

mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);

JacksonAnnotationIntrospector jacksonAnnotationIntrospector = new JacksonAnnotationIntrospector();
mapper.setDeserializationConfig(mapper.getDeserializationConfig().withAnnotationIntrospector
(jacksonAnnotationIntrospector));
mapper.setSerializationConfig(mapper.getSerializationConfig().withAnnotationIntrospector
(jacksonAnnotationIntrospector));

return mapper;
}
}

我的 jackson 对象看起来像这样:

@JsonRootName("foobar")
public class TestType {

@JsonProperty("goodbye")
String hello;

public String getHello() {
return hello;
}

public void setHello(String hello) {
this.hello = hello;
}
}

为方便起见,我的 web.xml 中也有这个,它允许您通过将 .json 放在 URL 上而不是设置标题来请求 json:
<context-param>
<param-name>resteasy.media.type.mappings</param-name>
<param-value>json : application/json, xml : application/xml</param-value>
</context-param>

当我打电话时 http://127.0.0.1:8080/api/v1/test.json我得到:
{
"foobar": {
"goodbye": "Here is some random string"
}
}

我已经在这里发布了我的完整工作代码: https://github.com/teacurran/java-experiments/tree/master/stackoverflow-sandbox/Q42416036

关于rest - 配置 Wildfly 10 以使用 Jackson(作为 JSON 提供程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42416036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com