我该如何在Glassfish / Payara REST服务器中注册jackson-datatype-joda

2020年4月23日 81点热度 0条评论

我在容器中有一个REST端点(Payara 4)
我已经为joda序列化扩展将依赖项添加到pom.xml中。

<dependency>
     <groupId>com.fasterxml.jackson.datatype</groupId>
     <artifactId>jackson-datatype-joda</artifactId>
     <version>2.10.3</version>
</dependency>

但是我得到的物品序列化不正确。


"dt":{"chronology":{},"millis":1499896800000}

我知道我需要使用jackson-databind-joda,但不确定如何在PAYARA中正确注册。有一些用于Spring Boot的示例,但是没有用于较旧的应用程序服务器的示例吗?

@Path("bom")
@Stateless
public class ProductionMaterialRestEndpoint {

    @POST
    @Path("kw/compare/{year}/{week}")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public ResultContainingDateTime compare(
            @PathParam("year") int year,
            @PathParam("week") int week) throws IOException, ExecutionException {

            ...               
    }    
}


public class ResultContainingDataTime {
    private org.joda.time.DateTime dt;
}

如何使用PAYARA / GLASSFISH内置的序列化器注册joda序列化器模块

解决方案如下:

JAX-RS基本上是关于如何在Java EE中编写REST Web服务的specification。它不指定用于序列化消息的技术,而仅指定接口MessageBodyReaderMessageBodyReader

如果使用Java EE 8,则将获得JSON-B(绑定),可确保开箱即用地进行JSON序列化。如果要改为使用Jackson,则需要对其进行配置(How to use Jackson 2 in Payara 5?)。此外,您不会像Spring Boot那样直接使用默认的Jackson模块自动配置(例如Java Time,Joda Time),而是必须自己为ObjectMapper注册它们。

如果您的代码使用Java 8和Java EE 8,则还可以使用java.time类,例如LocalDateTimeInstant等,并使用JSON-B批注指定如何使用