gpt4 book ai didi

java - 如何在 jersey2/hk2 应用程序中获取对 Jackson Object Mapper 的引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:34 25 4
gpt4 key购买 nike

我有一个 jersey2 应用程序配置为通过 Jackson 支持 JSON,添加

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>

在POM文件中

public MyApplication() {
...
register(JacksonFeature.class)
...
}

在我的申请中。一切正常,我的资源得到反序列化的 POJO 作为参数

@POST @Consumes(MediaType.APPLICATION_JSON)
public void blah(MyPojo p) {
...
}

现在,其中一个资源需要引用 Jackson 的 ObjectMapper 来自行进行一些反序列化。我试过做类似的事情

@Inject
public MyResource(@Context ObjectMapper mapper) {
...
}

@GET
public String foo(@Context ObjectMapper mapper) {
...
}

但在这两种情况下,对 mapper 的引用都是空的。如何在我的资源中注入(inject)对 ObjectMapper 的引用?

最佳答案

首先没有默认ObjectMapper由 Jackson 提供商使用。它不使用 ObjectMapper实际上。它利用其他 Jackson API 来处理(反)序列化。

如果你想使用/注入(inject)单个 ObjectMapper例如,那么你应该只创建一个 Factory为之

public class ObjectMapperFactory implements Factory<ObjectMapper> {

final ObjectMapper mapper = new ObjectMapper();

@Override
public ObjectMapper provide() {
return mapper;
}

@Override
public void dispose(ObjectMapper t) {}
}

然后绑定(bind)

register(new AbstractBinder(){
@Override
public void configure() {
bindFactory(ObjectMapperFactory.class)
.to(ObjectMapper.class).in(Singleton.class);
}
});

需要注意的是 ObjectMapper 的任何配置不是线程安全的。所以说你试图从你的资源方法配置它,那些操作不是线程安全的。

Jackson 提供者需要注意的另一件事是,如果我们提供 ContextResolver , 比如 mentioned by @Laurentiu L ,那么 Jackson 提供商将切换到使用我们的 ObjectMapper .在这种情况下,如果您想使用相同的 ObjectMapper , 然后你可以在 Factory 中查找它.例如

public class ObjectMapperFactory implements Factory<ObjectMapper> {

private final Providers providers;
final ObjectMapper mapper = new ObjectMapper();

public ObjectMapperFactory(@Context Providers providers) {
this.providers = providers;
}

@Override
public ObjectMapper provide() {
ContextResolver<ObjectMapper> resolver = providers.getContextResolver(
ObjectMapper.class, MediaType.APPLICATION_JSON);
if (resolver == null) { return mapper; }

return resolver.getContext(null);
}

@Override
public void dispose(ObjectMapper t) {}
}

要使上述工作正常(使用单个 ObjectMapper ),您需要确保实现 ContextResolver<ObjectMapper> ,并确保注释 ContextResolver与相应的@Produces@Consumes媒体类型。

关于java - 如何在 jersey2/hk2 应用程序中获取对 Jackson Object Mapper 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30258916/

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