通过@ResponseBody

时间:2019-03-13 12:23:02

标签: java spring spring-mvc marshalling hybris

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

我的问题不是this question,因为我的输出是一个JSON列表,我将其打印在Postman上,而不是使用具有JS和其他UI功能的视图。

它也不是this one,因为我返回的是JSON列表,而不仅仅是 Date 对象。

它是this one的扩展,但是我不认为Orika mapper是罪魁祸首。

使用@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());
}
  

映射器是:    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 DTO ,其中包含getter和setter和日期字段为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> 看起来像-

typeAdapters

在我的自定义代码中覆盖此bean时,它仍在选择<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> ,它总是选择值-

mycustomaddon-web-spring.xml

编辑3:

我尝试将<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> 中的bean替换为-

myproject.adapters.DateAdapter

我在acceleratoraddon/web中添加了自定义适配器类,即restart nginx 。 虽然没有解决。

1 个答案:

答案 0 :(得分:1)

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

注释中提到的typeAdapters属性是在另一个 jaxb-converters-spring.xml '

中定义的bean中定义的。
<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,在这里您可以在自定义扩展的websrc中定义bean和相应的类。