当前位置: 首页 > 知识库问答 >
问题:

如何在 Restlet 中注册 Jackson Jdk8 模块

易骁
2023-03-14

有没有可能注册jackson-datatype-jdk8扩展包中的jackson-datatype-jdk8模块?我需要利用新的可选特性。我的猜测是,它应该可以通过转换器服务(getConverterService())访问,但我在留档中找不到任何提示如何设置模块的内容。

共有2个答案

夏侯元忠
2023-03-14

@tarka的良好开端,但给了我流错误;我提出了一些[较低影响]的改进:

public class CustomJacksonConverter extends JacksonConverter {

    @Override
    protected <T> JacksonRepresentation<T> create(MediaType mediaType, T source) {
        return new CustomJacksonRepresentation<>(mediaType, source);
    }

    @Override
    protected <T> JacksonRepresentation<T> create(Representation source, Class<T> objectClass) {
        return new CustomJacksonRepresentation<>(source, objectClass);
    }

}

然后…

public class CustomJacksonRepresentation<T> extends JacksonRepresentation<T> {

    public CustomJacksonRepresentation(MediaType mediaType, T object) {
        super(mediaType, object);
    }

    public CustomJacksonRepresentation(Representation representation, Class<T> objectClass) {
        super(representation, objectClass);
    }

    public CustomJacksonRepresentation(T object) {
        super(object);
    }

    @Override
    protected ObjectMapper createObjectMapper() {
        ObjectMapper mapper = super.createObjectMapper();
        mapper.registerModule(new Jdk8Module());
        return mapper;
    }

}

并以与@tarka相同的方式更换转换器

蔚桐
2023-03-14

我最终从各种来源拼凑出了一个适用于Restlet 2.3的答案

第一步是创建自定义 Jackson 转换器,以实现您的任何自定义要求:

public class CustomJacksonConverter extends JacksonConverter { 
    @Override 
    protected <T> JacksonRepresentation<T> create(MediaType mediaType, T source) { 
        ObjectMapper mapper = createMapper(); 
        JacksonRepresentation<T> jr = new JacksonRepresentation<T>(mediaType, source); 
        jr.setObjectMapper(mapper); 
        return jr; 
    } 

    @Override 
    protected <T> JacksonRepresentation<T> create(Representation source, Class<T> objectClass) { 
        ObjectMapper mapper = createMapper(); 
        JacksonRepresentation<T> jr = new JacksonRepresentation<T>(source, objectClass); 
        jr.setObjectMapper(mapper); 
        return jr; 
    } 


    private ObjectMapper createMapper() { 
        JsonFactory jsonFactory = new JsonFactory(); 
        jsonFactory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false); 
        ObjectMapper mapper = new ObjectMapper(jsonFactory); 
        mapper.registerModule(new Jdk8Module()); 
        return mapper; 
    } 

} 

然后,您需要创建一种方法,用新转换器的副本替换默认的Jackson转换器:

static void replaceConverter(
            Class<? extends ConverterHelper> converterClass,
            ConverterHelper newConverter) {

        ConverterHelper oldConverter = null;

        List<ConverterHelper> converters = Engine.getInstance().getRegisteredConverters();
        for (ConverterHelper converter : converters) {
            if (converter.getClass().equals(converterClass)) {
                converters.remove(converter);
                oldConverter = converter;
                break;
            }
        }

        converters.add(newConverter);
    }

您现在可以替换入站根中的转换器:

replaceConverter(JacksonConverter.class, new CustomJacksonConverter());
 类似资料:
  • 我有一个C React本机模块,它派生自facebook::xplat::module::CxxModule。它在iOS项目中工作正常,但现在我正试图找出如何从Java中使用它。我找到的唯一文档是React Native codebase中的注释,其中指出: 实现用C编写的NativeModules不能提供任何Java代码(因此它们可以在其他平台上重用),而是应该使用CxxModuleWrappe

  • 我想设置一个由多个步骤组成的用户注册。每个步骤将以条的形式突出显示。深灰色条将是完成的步骤,浅灰色条将是需要完成的步骤。似乎想不出这样做的方法。请建议。 我们可以在myfitnesspal注册中看到这一点。我在下图的红色框中突出显示了这一点。

  • 问题内容: 如何在Swift中使用(以前)? 这是我尝试复制的一个Objective-C示例: 但是,Swift似乎没有,这(似乎)意味着我无法在未实现的方法上调用方法。 我已经在Swift中尝试了基于对象的版本,但似乎使Playground崩溃了: 但是它似乎崩溃了,即使我的对象接受了一个类型的参数 在Swift中执行此操作的最佳方法是什么?有没有一种方法可以避免通过基于对象的注册发送不必要的对

  • 我的注册成功。将向邮件发送通知,其中包含有关跟踪链接的请求的文本,然后激活帐户。一切都很好,但不可能将此文本转换为模板,以便将变量存储在其中,并将其发送到邮局,但我不知道如何从java代码中放置thymeleaf 使用者getUsername()用户。getActivationCode() 在我的例子中,它们以相同的形式返回,它们不会给出它们对应的用户的值 我的胸腺 我正在尝试通过上下文读取此文件

  • 我正在与Avro/Kafka和Confluent的Avro模式注册中心合作。 我使用avsc文件和avdl制作了一些基本模式和具有基本类型的主题。 我正在查看Confluent制作的API文档,以尝试将模式发展到版本2。特别是本部分: https://docs.confluent.io/current/schema-registry/using.html#register-a-new-versio

  • 我有两个Spring应用程序(“客户端应用程序”和“服务应用程序”),它们已经注册到Eureka(并通过外部客户端进行对话)。但是,我必须与Solr的一个实例交谈,我被迫在属性文件中硬编码IP地址。我宁愿不这样做,而是使用Eureka进行服务发现。 问:有没有一种方法/插件可以让solr向Eureka注册,这样客户端就可以发现它(即使它是通过启动侦听器或某种方式编程实现的)? 我看过SolrAPI