Tan*_*anc 7 java date serializer jackson
很抱歉这似乎是一个多余的问题,但我确实有很多选择,尽管我努力阅读了十几个主题,但我无法理解该怎么做.
我有一个java应用程序,其工作是:
计划如下:
SOAP WS ---- deliverydate ----> JAVA APP(逻辑)---- datebl ----> REST WS
在Java应用程序是使用的JAR jackson-core-asl-1.9.13.jar和jackson-mapper-asl-1.9.13.jar等等.
我遇到的问题是处理日期.
读物:(试图受到启发但杰克逊版似乎不一样):
JSON以自定义格式序列化日期(无法从String值构造java.util.Date的实例)
Jackson 2.3.2:尽管将日期格式设置为ObjectMapper,但仍然会对Date进行反序列化
编辑01/04/15
http://jackson-users.ning.com/forum/topics/cannot-deserialize-a-date
现在的事实
要点1: 从SOAP WS恢复数据时,deliverydate是一个String,其精确值为:
2014-07-31 07:00:00.0
第2点: 在使用setter之前,我认为将此String格式化为日期可能是个好主意.
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateebl = dateFormat.parse(deliverydate);
msi.setDatebl(dateebl);
Run Code Online (Sandbox Code Playgroud)
POJO中的datebl声明
private java.util.Date datebl;
Run Code Online (Sandbox Code Playgroud)
在此阶段,datebl值已转换为
Thu Jul 31 07:00:00 CEST 2014
(尽管选择具体格式yyyy-MM-dd HH:mm:ss)
点3和错误我有:我 的错误由其余服务器抛出:
无法从字符串值'Thu Jul 31 07:00:00 CEST 2014'构造java.util.Date的实例:不是有效的表示形式(错误:无法解析日期"Thu Jul 31 07:00:00 CEST 2014":不符合任何标准形式("yyyy-MM-dd'T'HH:mm:ss.SSSZ","yyyy-MM-dd'T'HH:mm:ss.SSS'Z'","EEE, dd MMM yyyy HH:mm:ss zzz","yyyy-MM-dd"))来源:org.glassfish.jersey.message.internal.EntityInputStream@5709779; line:1,column:74](通过引用链:com.rest.entities.MvtSwapsIn ["datebl"])
我试图做的: 要解决这个问题,因为我使用的是2.x之前的版本,我认为我最好的选择是使用自定义序列化程序,所以:
在pojo中,在getter之前添加了注释
@JsonSerialize(using = CustomJsonDateSerializer.class)
public java.util.Date getDatebl() {
return datebl;
}
Run Code Online (Sandbox Code Playgroud)Serializer创建如下
public class CustomJsonDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
SimpleDateFormat dateFormat = new SimpleDateFormat(Properties.General.FORMAT_HEURE_JSON_SERIALIZE_2);
String dateString = dateFormat.format(value);
jgen.writeString(dateString);
}
Run Code Online (Sandbox Code Playgroud)
}
在示例中,尝试使用FORMAT_HEURE_JSON_SERIALIZE_2,但尝试了许多其他没有成功.
public static final String FORMAT_HEURE_JSON = new String("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public static final String FORMAT_HEURE_JSON_SERIALIZE = new String("EEE yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public static final String FORMAT_HEURE_JSON_SERIALIZE_2 = new String("EEE, dd MMM yyyy HH:mm:ss zzz");
public static final String FORMAT_HEURE_JSON_SERIALIZE_3 = new String("yyyy-MM-dd HH:mm:ss");
Run Code Online (Sandbox Code Playgroud)
在这一点上,我迷路了.
我不知道在哪里以及如何更新我的代码.
有人可以帮我组织一下我的想法吗?
亲切的问候,
皮埃尔
打开您的POJO,注释日期字段声明,如此
@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "<your_date_pattern>")
Run Code Online (Sandbox Code Playgroud)
your_date_pattern可以是类似的地方
yyyy-MM-dd HH:mm:ss
Run Code Online (Sandbox Code Playgroud)
完成
我猜您正在使用 Jersey 作为 JAX-RS 实现。您是否从堆栈跟踪中遗漏了一些详细信息?阅读堆栈跟踪,泽西岛似乎收到了一个 String 而不是 Date: Can not construct instance of java.util.Date from String value 'Thu Jul 31 07:00:00 CEST 2014'。如果你的类com.rest.entities.MvtSwapsIn["datebl"])声明了一个日期,这种行为就有点奇怪了。
无论如何,为了让 Jackson 工作,一个建议是使用 ContextResolver 将 Jackson ObjectMapper 注册到 REST 配置(这适用于 Jackson 1.x 和 2.x)。尝试在构造函数和 getContext() 方法中放置一个断点,以查看它们是否在运行时被调用:
public class ObjectMapperConfigContextResolver implements ContextResolver<ObjectMapper> {
ObjectMapper mapper;
public ObjectMapperConfigContextResolver() {
mapper.setDateFormat(new SimpleDateFormat("<your pattern>"));
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
Run Code Online (Sandbox Code Playgroud)
}
@Provider 注释应该使 JAX-RS 选择您配置的 ObjectMapper。如果没有,您可以手动执行:
@ApplicationPath("/")
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<>();
classes.add(ObjectMapperConfigContextResolver.class);
return classes;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您提供 pom.xml 中的一些信息(如果您使用的是 Maven),将会很有帮助。
| 归档时间: |
|
| 查看次数: |
31966 次 |
| 最近记录: |