Java 带有Spring 4的JodDateTime序列化程序
我正在使用Spring 4和Joda Datetime。 我有自定义序列化程序,我有带序列化程序的注释域字段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,我读到我必须
@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));
}
}