【问题标题】:jax-rs ContextResolver<T> undestandingjax-rs ContextResolver<T> 无法理解
【发布时间】:2017-10-15 20:42:09
【问题描述】:

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

【问题讨论】:

    标签: jakarta-ee jax-rs resolver


    【解决方案1】:

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

    @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,如果没有,它将为ObjectMapper 查找ContextResolver 并调用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(...);
        }
    }
    

    【讨论】:

    • 这是一个很好的例子。是不是可以作为工厂根据输入来生产对象。
    • 你可以阅读the spec 4.3 Context Providers的解释。它没有详细说明它应该用于什么,所以我想它是用于一般用途的。如果你能让它工作,那么我猜就使用它。
    • 我无法找到任何文档说明应该从 ContextResolver 返回的对象类型对于特定的内容类型,但我确实在 RestEasy 文档中找到了这条评论:@ 987654323@
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多