我只是想更改@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
?
日期在此处格式化:
de.hybris.platform.webservicescommons.jaxb.adapters.DateAdapter#marshal()
格式:yyyy-MM-dd'T'HH:mm:ssZ
现在,如何重写此类?
我无法覆盖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
我尝试将<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
。
虽然没有解决。
答案 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和相应的类。