【发布时间】: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