Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring MVC注释的自定义日期json序列化程序被忽略_Java_Json_Spring Mvc_Jackson - Fatal编程技术网

Java spring MVC注释的自定义日期json序列化程序被忽略

Java spring MVC注释的自定义日期json序列化程序被忽略,java,json,spring-mvc,jackson,Java,Json,Spring Mvc,Jackson,我有一个运行SpringMVC3.1.x的Java1.7应用程序,带有hibernate,由SQLServer2008支持,使用Jackson 1.9.x将域对象序列化为JSON 项目结构只是一个标准的SpringMVC设置,没有什么特别的,我有一个控制器、服务和存储库,使用hibernate连接到SQLServer。哦,我正在使用Maven 3.3.9进行依赖关系管理 我的问题是日期字段的格式不正确。从我的端点返回的数据只是将默认格式转换为历元数 为此,我创建了一个自定义序列化程序: impo

我有一个运行SpringMVC3.1.x的Java1.7应用程序,带有hibernate,由SQLServer2008支持,使用Jackson 1.9.x将域对象序列化为JSON

项目结构只是一个标准的SpringMVC设置,没有什么特别的,我有一个控制器、服务和存储库,使用hibernate连接到SQLServer。哦,我正在使用Maven 3.3.9进行依赖关系管理

我的问题是日期字段的格式不正确。从我的端点返回的数据只是将默认格式转换为历元数

为此,我创建了一个自定义序列化程序:

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonDateSerialiser extends JsonSerializer<Date> {

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
        String formattedDate = simpleDateFormat.format(date);
        jsonGenerator.writeString(formattedDate);
    }
}
但是注释被忽略了

这是我的控制器(减去导入):

我还研究了关于堆栈溢出和其他web资源的各种不同答案,这些答案主要是指上面的代码。这里的任何帮助都会很好,谢谢

更新

此后,我发现了jackson
ObjectMapper
MappingJacksonHttpMessageConverter
的一些bean配置,它们可能会覆盖我的类注释

请记住,我使用的是遗留代码,所以请不要在这里判断任何不推荐的用法。以下是配置代码段:

<bean id="jaxbAnnIntrospector" class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector" />
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper">
    <property name="serializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
    <property name="deserializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
              p:objectMapper-ref="jacksonObjectMapper" />
    </mvc:message-converters>
</mvc:annotation-driven>

更新:


bean配置是关键。我只需要向对象映射器添加一个日期格式,该格式在应用程序中被全局使用。我将用全套bean添加一个正确的答案。我还删除了所有域类级带注释的序列化程序,因为它们由于应用程序级bean而被忽略。

这里显示的内容不容易解决您的问题。然而,我想和你们分享我的想法。您的序列化程序实现正确。在这里,您使用的是jackson库,这样您就可以通过将json字符串序列化为java对象来执行序列化操作。我想你可以在这一步解决问题。进行序列化您可以这样做:

ObjectMapper mapper = new ObjectMapper();
//deserialize json to object
MyDomainObject domainObject = mapper.readValue("Your json file or json string", MyDomainObject.class);

//serialize object to json string
String jsonString = mapper.mapper.writeValueAsString(domainObject);
日期和其他字段将被正确序列化


我找到了还创建自定义日期序列化程序的教程。

所以问题只是应用程序级bean配置覆盖了我的类级注释

这是jackson映射器等的bean配置的更新版本。请注意使用它的附加
SimpleDateFormat
bean和
ObjectMapper
dateFormat
属性

<bean id="jsonDateFromat" class="java.text.SimpleDateFormat">
    <constructor-arg value="yyyy-MM-dd HH:mm:ss z"/>
</bean>
<bean id="jaxbAnnIntrospector" class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector" />
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper">
    <property name="serializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
    <property name="deserializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
    <property name="dateFormat" ref="jsonDateFromat"/>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
              p:objectMapper-ref="jacksonObjectMapper" />
    </mvc:message-converters>
</mvc:annotation-driven>

你能告诉我们你期望在哪里将对象序列化为JSON(你的控制器)和你看到的实际JSON吗?我不能重现这个。请提供一个。@Sotirios Delimanolis,这是否意味着您无法通过使用域对象代码和序列化程序与具有类似依赖项的标准spring mvc 3.1应用程序重现此问题,或者您的意思是此处没有足够的详细信息来执行此操作?我不想把整个应用程序都包括在内,从而使问题变得太过嘈杂。你不能假设应用程序可以工作,而只关注serialiser方面吗?我不能重现这意味着我接受了你发布的代码,对你的配置做了最低限度的假设,并尝试执行它。我得到的结果不是你描述的结果。我不想让你发布你的整个申请。我希望您调试您的应用程序,直到您可以去除所有与问题无关的部分,然后发布。有趣的是,您得到了日期格式,正如您所描述的“2016年11月9日9:33:31 AM”,因为我在示例中使用的格式字符串应该输出“2016-11-09 09:33:31{your timezone}”。您是否调试了代码以查看它是否确实命中了JsonSerializer?或者你有一个不同的简单日期格式吗?我不明白这个答案的目的。如果您无法重现问题,请标记/投票以该原因结束问题。他们并没有试图反序列化JSON,而是试图将POJO序列化为JSON。@SotiriosDelimanolis。我明白了这个问题,我想在这里显示反序列化和序列化。可能是我打字出错了。
<bean id="jaxbAnnIntrospector" class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector" />
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper">
    <property name="serializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
    <property name="deserializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
              p:objectMapper-ref="jacksonObjectMapper" />
    </mvc:message-converters>
</mvc:annotation-driven>
ObjectMapper mapper = new ObjectMapper();
//deserialize json to object
MyDomainObject domainObject = mapper.readValue("Your json file or json string", MyDomainObject.class);

//serialize object to json string
String jsonString = mapper.mapper.writeValueAsString(domainObject);
<bean id="jsonDateFromat" class="java.text.SimpleDateFormat">
    <constructor-arg value="yyyy-MM-dd HH:mm:ss z"/>
</bean>
<bean id="jaxbAnnIntrospector" class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector" />
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper">
    <property name="serializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
    <property name="deserializationConfig.annotationIntrospector" ref="jaxbAnnIntrospector" />
    <property name="dateFormat" ref="jsonDateFromat"/>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
              p:objectMapper-ref="jacksonObjectMapper" />
    </mvc:message-converters>
</mvc:annotation-driven>
[
 {
    "dateTimeOfEvent": "2016-11-09 14:19:20 GMT"
 },
 {
    "dateTimeOfEvent": "2016-11-09 14:25:15 GMT"
 }
]