【问题标题】:JsonSerialize / JsonDeserialize not working in Apache Tomcat (TomEE)JsonSerialize / JsonDeserialize 在 Apache Tomcat (TomEE) 中不起作用
【发布时间】:2019-05-29 11:18:43
【问题描述】:

稍后编辑 2019-05-31

如果我编写了一个示例main 方法来实例化一个项目,然后调用String s = new ObjectMapper().writeValueAsString(item);,那么自定义序列化程序被正确调用并生效。

该问题在整个应用部署在 Apache TomEE 服务器中时出现。


稍后编辑:注释的放置不是问题(在字段上与在 getter 上),我尝试了各种组合(在 getter 上的注释,在私有字段,公共字段上的注释等...)


代码:

import com.fasterxml.jackson....
// YES, all JSON-related stuff is from fasterxml

@JsonAutoDetect
public class Item {
    private Date lastModified;

    @JsonSerialize(using = CSer.class)
    public Date getLastModified() {
        return lastModified;
    }

    public class CSer extends JsonSerializer<Date> {
        public SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

        @Override
        public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException, JsonProcessingException {
            gen.writeString(dateFormat.format(value));
        }
    }
}

// some place else, in a REST service class
    ...
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getItems(... {
        ...
        return Response.ok(result.getData()).build();
        // result.getData() is an ArrayList of "Item" objects.
    }

问题

  • from what I know,日期的默认JSON输出格式应该是时间戳。就我而言,不是,而是 yyyyMMddHHmmssZ
  • 自定义序列化程序没有效果,我无法更改日期的输出格式,serialize 方法从不 被调用。

我的 lib 文件夹中的 jackson 文件:jackson-annotations-2.8.0.jar、jackson-core-2.8.8.jar、jackson-databind-2.8.8.1.jar .

我做错了什么?

谢谢。

【问题讨论】:

  • “仅当整个应用程序部署在 Apache TomEE 服务器中时才会出现此问题。” - 也许您可以调试您的应用程序以检查您的应用程序服务器实际使用的序列化方法。您的错误听起来像 TomEE 通过设置 Produces 隐含地不使用您期望的“正确”序列化方法。
  • 我试过调试,我的自定义序列化程序没有被调用。总而言之,经过几天的试用和调试以及more investigations,我刚刚放弃并使用了来自 TomEE 的内置 Johnzon JSON 实现。我仍然不知道是否有可能以及如何使用 Jackson 而不是 Johnzon...

标签: java json rest date jackson


【解决方案1】:

这可能与您将注释放在 getter 上有关 - 您可能会移动它以反映类似于

public class Item {

    @JsonSerialize(using = CSer.class)
    private Date lastModified;

   // ...
}

或者您必须将 Jackson 配置为仅使用 getter 进行序列化。

【讨论】:

  • 不,这不是原因。我尝试了各种组合(带有注释的公共字段、getter 上的注释、字段等...)。
猜你喜欢
  • 2019-11-13
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2018-03-13
  • 2021-03-28
相关资源
最近更新 更多