如何在WildFly中将JSON java.util.Date变量序列化为ISO-8601格式的日期字符串?

时间:2014-04-01 06:15:27

标签: json jboss jackson resteasy wildfly

我正在使用WildFly 8.0.0 Final。其余的WebService实现是RestEasy。根据WildFly / Jboss文档,我添加了jboss-deployment-structure.xml以使用Jackson2.2。*提供程序。

<jboss-deployment-structure>
    <deployment>
        <exclusions>
           <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure> 

现在,我的问题是所有java.util.Date变量都没有序列化为ISO-8601格式。我看过这篇文章Wildfly using the Jackson provider instead of Jettison,但它使用的是jackson-provider-1。

是否有任何配置可以将所有日期变量格式化为ISO-8601?

我不想添加任何外部依赖项。仅使用WildFly提供的是最佳选择。我已将以下依赖项添加到我的pom.xml文件中。我的代码位于https://github.com/evil850209/javaee7-samples

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.3.0</version>
    <scope>provided</scope>
</dependency>

我已经完成了这篇文章(Wildfly using the Jackson provider instead of Jettison)提到的内容。现在我收到了新的错误:

Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
    at org.chris.demo.rest.JacksonConfig.<init>(JacksonConfig.java:18)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.7.0_25]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) [rt.jar:1.7.0_25]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.7.0_25]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) [rt.jar:1.7.0_25]
    at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:148)

我已经更改了我的jboss-deployment-structure.xml,并将其放在WEB-INF文件夹下。

<?xml version="1.0" ?>
<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import" />
            <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

我的JacksonConfig课程就像:

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonConfig implements ContextResolver<ObjectMapper> {

    private final ObjectMapper objectMapper;

    public JacksonConfig() {
        objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return objectMapper;
    }

}

似乎jboss-deployment-structure.xml没有将jackson2类导入我的WildFly服务器。有没有人如何解决这个问题?

1 个答案:

答案 0 :(得分:-1)

您可以使用

直接在pom.xml文件中配置编码
<properties>
    <project.build.sourceEncoding>ISO-8601</project.build.sourceEncoding>
    <project.reporting.outputEncoding>ISO-8601</project.reporting.outputEncoding>
</properties>

这应该用ISO-8601编码整个项目,包括你的日期变量。

另一种可能性是使用Utils Class和SimpleDateFormat转换程序中的变量:

public abstract class DateUtils {
    private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /** Returns the current time as a String. */
    public static String getCurrentDate() {
        return SIMPLE_DATE_FORMAT.format(new Date());
    }
}

此方法会将Date变量作为格式化字符串返回。