首页 文章

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

提问于
浏览
3

我正在使用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 回答

  • -1

    您可以使用以下命令直接在pom.xml文件中配置编码

    <properties>
        <project.build.sourceEncoding>ISO-8601</project.build.sourceEncoding>
        <project.reporting.outputEncoding>ISO-8601</project.reporting.outputEncoding>
    </properties>
    

    这应该用ISO-8601对整个项目进行编码,包括Date变量 .

    另一种可能性是使用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变量作为格式化String返回 .

相关问题