5

但我试图了解 jax-rs 中提供者的用法。但无法理解如何使用 ContextResolver。有人可以用一些基本的例子来解释这个吗?

4

1 回答 1

6

您会看到它在解析序列化上下文对象中被大量使用。例如ObjectMapper用于 JSON 序列化。例如

@Provider
@Produces(MediaType.APPLICATION_JSON)
public static JacksonContextResolver implements ContextResolver<ObjectMapper> {
    private final ObjectMapper mapper;

    public JacksonContextResolver() {
        mapper = new ObjectMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> cls) {
        return mapper;
    }
}

现在将会发生的是,Jackson 提供程序,即JacksonJsonProvider在序列化时,将首先查看它是否已被赋予一个ObjectMapper,如果没有,它将查找 aContextResolverObjectMapper调用getContext(classToSerialize)以获取ObjectMapper. 所以这确实是一个机会,如果我们想使用传递来做一些逻辑Class来确定哪个映射器(如果有多个)用于哪个类。对我来说,一般来说,我只用它来配置映射器。

这个想法是您可以在某些上下文中查找任意对象。您如何查找的一个示例ContextResolver是通过Providers可注入接口。例如在资源类中

@Path("..")
public class Resource {
    @Context
    private Providers provider;

    @GET
    public String get() {
        ContextResolver<ObjectMapper> resolver
            = providers.getContextResolver(ObjectMapper.class, MediaType.APPLICATION_JSON);
        ObjectMapper mapper = resolver.getContext(...);
    }
}
于 2015-09-09T11:42:59.657 回答