ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-通过@ResponseBody返回时,更改DTO JSON中的日期格式

2019-10-12 01:03:15  阅读:578  来源: 互联网

标签:hybris java spring spring-mvc marshalling


我只想更改@ResponseBody返回的DTO中的日期格式

我的问题不是this question,因为我的输出是一个JSON列表,我将其打印在Postman上,而不是使用具有JS和其他UI功能的视图.
它也不是this one,因为我返回的是JSON列表,而不仅仅是Date对象,它是this one的扩展,但我认为Orika映射器不是罪魁祸首.
我在使用@ResponseBody返回列表时获得日期的时间戳值.

我的自定义代码-

@RequestMapping(value = "/my/report", method = RequestMethod.POST)
@ResponseBody
public List<OrderWsDTO> createReport() {
    //stuff
    return Optional.ofNullable(orderDataList)
            .orElse(Collections.emptyList())
            .stream()
            .map(orderData -> getDataMapper().map(orderData, OrderWsDTO.class, fields))
            .collect(Collectors.toList());
}

The mapper is:
map:162, ConfigurableMapper (ma.glasnost.orika.impl)

与getDataMapper().mapAsList(orderDataList,OrderWsDTO.class,fields)相同的问题:

@RequestMapping(value = "/my/report", method = RequestMethod.POST)
@ResponseBody
public List<OrderWsDTO> createReport() {
    //stuff
    return getDataMapper().mapAsList(orderDataList, OrderWsDTO.class, fields);
}

OrderWsDTO是具有getter和setter的DTO,并且日期字段是java.util.Date.
在邮递员中,我可以看到日期格式为:“ date”:“ 1552476861991”

相同的确切调用返回OrderWsDTO而不是List< OrderWsDTO>.更改日期格式.它将日期打印为2019-03-13T12:10:05 0000,其格式为:yyy-MM-dd’T’HH:mm:ss.SSXXX

@RequestMapping(value = "/my/report", method = RequestMethod.POST)
@ResponseBody
public OrderWsDTO createReport() {
    //stuff
    return getDataMapper().map(orderData, OrderWsDTO.class, fields);
}

为什么在以List< DTO>打印时日期显示两种不同的格式?和DTO?
另外,它在哪里获取格式:yyy-MM-dd’T’HH:mm:ss.SSXXX?

编辑1:

日期在这里被格式化:
de.hybris.platform.webservicescommons.jaxb.adapters.DateAdapter#marshal()格式:yyyy-MM-dd’T’HH:mm:ssZ
现在,如何重写此类?

编辑2:

我无法覆盖具有修改日期的适配器列表的jaxbContextFactory. jaxbContextFactory看起来像-

<alias name="defaultJaxbContextFactory" alias="jaxbContextFactory"/>
<bean id="defaultJaxbContextFactory" class="de.hybris.platform.webservicescommons.jaxb.MoxyJaxbContextFactoryImpl">
    <property name="wrapCollections" value="${webservicescommons.messageconverters.context.wrapCollections}" />
    <property name="analysisDepth" value="${webservicescommons.messageconverters.context.analysisDepth}" />
    <property name="typeAdapters" ref="jaxbTypeAdaptersList" />
    <property name="subclassRegistry" ref="subclassRegistry" />
    <property name="otherClasses" ref="jaxbContextClasses" />
    <property name="metadataSourceFactory" ref="metadataSourceFactory" />
    <property name="excludeClasses"  ref ="jaxbContextFactoryExcludeClasses"/>
</bean>

在我的自定义代码中覆盖此bean时,它仍在为typeAdapters选择旧值.有趣的是,它正在用我的自定义属性替换其他属性.
我的自定义覆盖的豆-

<alias name="defaultJaxbContextFactory" alias="jaxbContextFactory"/>
<bean id="defaultJaxbContextFactory" class="de.hybris.platform.webservicescommons.jaxb.MoxyJaxbContextFactoryImpl">
    <property name="wrapCollections" value="false" />
    <property name="analysisDepth" value="30" />
    <property name="typeAdapters" ref="mylist" />
    <property name="subclassRegistry" ref="subclassRegistry" />
    <property name="otherClasses" ref="jaxbContextClasses" />
    <property name="metadataSourceFactory" ref="metadataSourceFactory" />
    <property name="excludeClasses"  ref ="jaxbContextFactoryExcludeClasses"/>
</bean>

<util:list id="mylist">
    <value>com.myproject.mymodule.myadapter</value>
    <value>de.hybris.platform.webservicescommons.jaxb.adapters.VariableMapAdapter</value>
    <value>de.hybris.platform.webservicescommons.jaxb.adapters.XSSStringAdapter</value>
</util:list>

对于typeAdapters,它总是在选择值-

<property name="typeAdapters">
        <list>
            <value>de.hybris.platform.webservicescommons.jaxb.adapters.DateAdapter</value>
            <value>de.hybris.platform.webservicescommons.jaxb.adapters.StringMapAdapter</value>
            <value>de.hybris.platform.webservicescommons.jaxb.adapters.XSSStringAdapter</value>
        </list>
    </property>

编辑3:

我尝试将mycustomaddon-web-spring.xml中的bean覆盖为-

<bean id="customJaxbContextFactory" parent="jaxbContextFactory">
    <property name="metadataSourceFactory" ref="customMetadataSourceFactory" />
    <property name="typeAdapters">
        <list>
            <value>myproject.adapters.DateAdapter</value>
            <value>de.hybris.platform.webservicescommons.jaxb.adapters.StringMapAdapter</value>
            <value>de.hybris.platform.webservicescommons.jaxb.adapters.XSSStringAdapter</value>
        </list>
    </property>
</bean>

我在acceleratoraddon / web中添加了自定义适配器类,即myproject.adapters.DateAdapter.
虽然没有解决.

解决方法:

首先在“ webservicescommons-spring.xml”中定义“ jaxbContextFactory” bean,该bean在应用程序上下文中创建该bean.因此,当您使用(customExtension)-spring.xml在自定义扩展中覆盖bean时,它只是在应用程序上下文中覆盖bean.有关在Hybris中加载上下文的更多信息,请参见here.

您注释中提到的typeAdapters属性是在另一个bean中定义的,该bean在’jaxb-converters-spring.xml’中定义

<bean id="customJaxbContextFactory" parent="jaxbContextFactory">
        <property name="metadataSourceFactory" ref="customMetadataSourceFactory" />
        <property name="typeAdapters">
            <list>
                <value>de.hybris.platform.webservicescommons.jaxb.adapters.DateAdapter</value>
                <value>de.hybris.platform.webservicescommons.jaxb.adapters.StringMapAdapter</value>
                <value>de.hybris.platform.webservicescommons.jaxb.adapters.XSSStringAdapter</value>
            </list>
        </property>
    </bean>

由于jaxb-converters-spring-xml中定义的Bean已加载到WebApplicationContext中,因此您需要使用(customExtension)-web-spring.xml覆盖此Bean,您可以在其中定义Bean和相应类的websrc.您的自定义扩展名.

标签:hybris,java,spring,spring-mvc,marshalling
来源: https://codeday.me/bug/20191012/1896644.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有