gpt4 book ai didi

json - Jackson 2 错误地序列化 Java java.nio.file.Path

转载 作者:行者123 更新时间:2023-12-04 22:24:41 24 4
gpt4 key购买 nike

我在 Eclipse 4.6.1 中使用 RESTEasy 3.1.0.CR3 和 Tomcat 8.5.6,以及 JSBoss resteasy-jackson2-provider。我有一个简单的 JavaBean FooBar返回一个字符串“ID”和一个 java.nio.file.Path “小路”。

Jackson 使这很容易序列化为 JSON。在我的 JAX-RS 资源中,我只需指定 @Produces("application/json; charset=UTF-8") .但 jackson 没有使用 Path.toString() .相反,它似乎在使用 Path.toURI().toString()或者其他的东西:

{
"id": "foo",
"path": "file:///C:/Users/jdoe/bar"
}

为什么!??更重要的是,我怎样才能让 jackson 简单地使用 toString() Path 的版本?

这是我的项目依赖树:
+- com.google.code.findbugs:jsr305:jar:3.0.1:provided
+- com.google.guava:guava:jar:20.0:compile
+- javax.ws.rs:javax.ws.rs-api:jar:2.0.1:provided
+- org.jboss.resteasy:resteasy-jaxrs:jar:3.1.0.CR3:compile
| +- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.0_spec:jar:1.0.1.Beta1:compile
| +- org.jboss.resteasy:resteasy-jaxrs-services:jar:3.1.0.CR3:compile
| +- org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:jar:1.0.0.Final:compile
| +- javax.activation:activation:jar:1.1.1:compile
| +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
| | +- org.apache.httpcomponents:httpcore:jar:4.4.4:compile
| | +- commons-logging:commons-logging:jar:1.2:compile
| | \- commons-codec:commons-codec:jar:1.9:compile
| +- commons-io:commons-io:jar:2.5:compile
| +- net.jcip:jcip-annotations:jar:1.0:compile
| \- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
+- org.jboss.resteasy:resteasy-servlet-initializer:jar:3.1.0.CR3:compile
+- org.jboss.resteasy:resteasy-jackson2-provider:jar:3.1.0.CR3:compile
| +- com.fasterxml.jackson.core:jackson-core:jar:2.8.3:compile
| +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.3:compile
| +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.3:compile
| \- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar:2.8.3:compile
| +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar:2.8.3:compile
| \- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.8.3:compile
+- junit:junit:jar:4.12:test
| \- org.hamcrest:hamcrest-core:jar:1.3:test
\- org.hamcrest:hamcrest-library:jar:1.3:test

请注意,在我的 FooBar 中添加注释是 Not Acceptable 。类,这是一个域模型类,不应与 RESTful API 序列化细节耦合。

我想要一种简单的方法在 RESTEasy 中连接到 Jackson2 并修改 Path 的序列化属性值而无需修改我的类或为我的类编写自定义序列化程序。

最佳答案

此类将覆盖默认的 Jackson2JsonProvider,帮助您根据需要配置 ObjectMapper,例如 Path.class 的序列化程序从 NioPathSerializer 覆盖到 ToStringSerializer。

@Provider
@Consumes({"application/*+json", "text/json"})
@Produces({"application/*+json", "text/json"})
public class CustomJacksonProvider extends JacksonJsonProvider {

public CustomJacksonProvider(){
super(configureMapper(new ObjectMapper()));
}

public static ObjectMapper configureMapper(ObjectMapper mapper) {
SimpleModule m = new SimpleModule("PathToString");
m.addSerializer(Path.class,new ToStringSerializer());
mapper.registerModule(m);
return mapper;
}

}
或者你也可以使用 ContextResolver 来使用 ResteasyJackson2Provider(RestEasy 默认)
@Provider
@Consumes({"application/*+json", "text/json"})
@Produces({"application/*+json", "text/json"})
public class CustomJacksonProvider implements ContextResolver<ObjectMapper> {

final ObjectMapper mapper;

public CustomJacksonProvider(){
mapper = new JsonMapperConfigurator(new ObjectMapper(), JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS)
.getConfiguredMapper();
SimpleModule m = new SimpleModule("PathToString");
m.addSerializer(Path.class, new ToStringSerializer());
}

@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
将此添加到您 web.xml无论您使用何种方法:
    <context-param>
<param-name>resteasy.providers</param-name>
<param-value>package.to.CustomJacksonProvider</param-value>
</context-param>
如果您没有使用 web.xml文件,在 JAX-RS 应用程序的 Application.getClasses() 中返回提供程序类方法。
希望这可以帮助。
已编辑 :
此外,您可能会错过此实现中的 JAXB 注释支持,您必须手动配置它,因为 JacksonJaxbJsonProvider不寻找 JsonMapperConfigurator 的解析器/提供者.使用 JsonMapperConfiguration映射器在 CustomJackosnProvider连同 JacksonJaxbJsonProvider.DEAFULT_ANNOATIONS .理想情况下,由于没有规定提供 JsonMapperConfiguration Resolver/Provider 和 RestEasy 的 jackson provider 不公开 arg 构造函数,provider 是最好的选择。由于他们做出了这个决定,理想情况下他们不应该在 ResteasyJackson2Provider 中进行任何定制。 .此外,只有 ResteasyJackson2Provider 中的功能是自定义 json 类型,并且在类级别更好地缓存映射器。
根据说明更新代码

关于json - Jackson 2 错误地序列化 Java java.nio.file.Path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557821/

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