Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有Spring 4的JodDateTime序列化程序_Java_Spring_Serialization_Jodatime - Fatal编程技术网

Java 带有Spring 4的JodDateTime序列化程序

Java 带有Spring 4的JodDateTime序列化程序,java,spring,serialization,jodatime,Java,Spring,Serialization,Jodatime,我正在使用Spring 4和Joda Datetime。 我有自定义序列化程序,我有带序列化程序的注释域字段 @JsonSerialize(using=ISODateTimeSerializer.class) private DateTime date; 这很好 现在,我需要在序列化程序中使用我的服务。这意味着我必须用Spring配置注册我的序列化程序。我尝试了几种不同的方法,但没有一种有效,注入的服务总是空的 我有几个conf类的ApplicationConfiguration,我读到我必须

我正在使用Spring 4和Joda Datetime。 我有自定义序列化程序,我有带序列化程序的注释域字段

@JsonSerialize(using=ISODateTimeSerializer.class)
private DateTime date;
这很好

现在,我需要在序列化程序中使用我的服务。这意味着我必须用Spring配置注册我的序列化程序。我尝试了几种不同的方法,但没有一种有效,注入的服务总是空的

我有几个conf类的ApplicationConfiguration,我读到我必须制作ObjectMapper并注册它。我找不到如何做这件事的指南,你知道应该如何做到吗

更新1

我的序列化程序

public class ISODateTimeSerializer extends JsonSerializer<DateTime> {

@Inject
private SecurityUtils securityUtils;

    private static DateTimeFormatter formatter =
            DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");


    @Override
    public void serialize(DateTime value, JsonGenerator generator,
                          SerializerProvider arg2)
            throws IOException {

        UserSecurityWrapper user = securityUtils.getCurrentUser();      
        //... some logic


        generator.writeString(formatter.withZone(dateTimeZone).print(value));
    }

}
谢谢

更新2 我试过了,但还是没有成功

@Configuration
public class ObjectMappingConfiguration {

    private static final Logger log = LoggerFactory.getLogger(ObjectMappingConfiguration.class);

    @Bean
    public Module apiJodaModule() {
        return new ApiJodaModule();
    }

    @SuppressWarnings("serial")
    private static class ApiJodaModule extends SimpleModule {
        public ApiJodaModule() {
            addDeserializer(DateTime.class, new ISODateTimeDeserializer());
            addSerializer(DateTime.class, new ISODateTimeSerializer());
        }
    }

}




public class ISODateTimeSerializer extends StdScalarSerializer<DateTime> {

    private static DateTimeFormatter formatter =
            DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");

    @Inject
    private SecurityUtils securityUtils;

    public ISODateTimeSerializer() {
        super(DateTime.class);
    }

    @Override
    public void serialize(DateTime value, JsonGenerator generator,
                          SerializerProvider arg2)
            throws IOException {

        UserSecurityWrapper user = securityUtils.getCurrentUser();
        //.....


        generator.writeString(formatter.withZone(dateTimeZone).print(value));
    }


}
关于如何向ObjectMapper实例添加自定义序列化程序

如果您使用的是SpringXML,这可能会使在ObjectMapper上调用任意方法变得困难,那么请看一看创建SpringFactoryBean


假设您使用的是Spring MVC,并且您希望修改MVC框架使用的ObjectMapper,那么您必须查看。

您的代码的问题似乎是您自己使用new处理序列化器/反序列化器对象实例化,而不是将该职责委托给Spring

您可以向ISODateTimeSerializer添加@Component注释,并假设已启用组件扫描,并在ObjectMappingConfiguration中为其使用@Autowired

@Configuration
public class ObjectMappingConfiguration {

    private static final Logger log = LoggerFactory.getLogger(ObjectMappingConfiguration.class);

    @Bean
    public Module apiJodaModule() {
        return new ApiJodaModule();
    }

    @SuppressWarnings("serial")
    private static class ApiJodaModule extends SimpleModule {
        public ApiJodaModule() {
            addDeserializer(DateTime.class, new ISODateTimeDeserializer());
            addSerializer(DateTime.class, new ISODateTimeSerializer());
        }
    }

}




public class ISODateTimeSerializer extends StdScalarSerializer<DateTime> {

    private static DateTimeFormatter formatter =
            DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");

    @Inject
    private SecurityUtils securityUtils;

    public ISODateTimeSerializer() {
        super(DateTime.class);
    }

    @Override
    public void serialize(DateTime value, JsonGenerator generator,
                          SerializerProvider arg2)
            throws IOException {

        UserSecurityWrapper user = securityUtils.getCurrentUser();
        //.....


        generator.writeString(formatter.withZone(dateTimeZone).print(value));
    }


}