无法从String值构造java.util.Date的实例 - 不是有效的表示形式

Tan*_*anc 7 java date serializer jackson

很抱歉这似乎是一个多余的问题,但我确实有很多选择,尽管我努力阅读了十几个主题,但我无法理解该怎么做.

我有一个java应用程序,其工作是:

  1. 从SOAP WS(XML)获取数据,
  2. 做一些逻辑(传入的deliverydate将成为datebl)
  3. 最后将其发送到REST WS(JSON格式),它将更新Oracle表

计划如下:
SOAP WS ---- deliverydate ----> JAVA APP(逻辑)---- datebl ----> REST WS

在Java应用程序是使用的JAR jackson-core-asl-1.9.13.jarjackson-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)

在这一点上,我迷路了.

我不知道在哪里以及如何更新我的代码.

  1. 从SOAP ws获取日期后我还应该使用SimpleDateFormat吗?
  2. 鉴于我使用的是jackson 1.9,我的@JsonSerialize注释是否很好?(以及序列化器?)
  3. 我是否必须修改其余服务器上的内容?

有人可以帮我组织一下我的想法吗?

亲切的问候,

皮埃尔

Chr*_*oti 7

打开您的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)

完成


tho*_*s77 1

我猜您正在使用 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),将会很有帮助。