Изменить формат дата в DTO JSON на возвращении через @Responsebode -- java поле с участием spring поле с участием spring-mvc поле с участием marshalling поле с участием hybris пол Связанный проблема

Change date format in DTO JSON on returning through @ResponseBody


2
vote

проблема

русский

Я просто хочу изменить формат даты в моем DTO, возвращенный @Responseboodbody

Мой вопрос не Этот вопрос как мой выход Список JSON и я печатаю его по почтенаме вместо того, чтобы использовать вид с JS и другими функциями пользовательского интерфейса.

Это не Это тоже , потому что я возвращаю список JSON, а не только Дата объект.

Это расширение этот один , но я не думаю, <код> Orika mapper - это виновник.

Я получаю значение Timestamm Value даты на возврате списка, используя <код> @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()); }   

Mapper: Карта: 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 и Getters и полета, которое является <код> java.util.Date .

в Postman Я могу видеть формат даты как:
<код> "date": "1552476861991"

тот же точный вызов, который возвращает <код> OrderWsDTO вместо <кода> List<OrderWsDTO> изменения формата даты. Это печатает дату <код> @ResponseBody0 , который является форматом: <код> @ResponseBody1

 <код> @ResponseBody2  


Почему дата показывает два разных формата при напечатании в <Код> @ResponseBody3 и <код> @ResponseBody4 ?

также, где он получает формат: <код> @ResponseBody5 ?


Редактировать 1:

Дата становится отформатированной здесь: <Код> @ResponseBody6
Формат: <код> @ResponseBody7

Теперь, как переопределить этот класс?


Редактировать 2:

Я не могу переопределить <код> @ResponseBody8 , который имеет список адаптеров для изменения даты. <Код> @ResponseBody9 выглядит как -

 <код> @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()); } 0  

На переопределении этого боба в моем пользовательском коде все еще выбирает старые значения для @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()); } 1 . Интересно, что это заменяет другие свойства с моими пользовательскими свойствами.

Мой пользовательский переопределенный фасоль -

 <код> @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()); } 2  

для <код> @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()); } 3 Он всегда собирает значения -

 <код> @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()); } 4  

Редактировать 3:

Я пытался переопределить боб в <код> @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()); } 5 как -

 <код> @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()); } 6  

Я добавил пользовательский класс адаптера I.e. <Код> @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()); } 7 в <Код> @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()); } 8 . Не сработал, хотя.

Английский оригинал

I simply want to change the date format in my DTO returned by @ResponseBody

My question is not this question as my output is a JSON List and I am printing it on Postman instead of using a view with JS and other UI features.

It's not this one as well because I am returning a JSON List, not just the Date object.

It is an extension of this one, but I don't think Orika mapper is the culprit.

I am getting the timestamp value of date on returning the List using @ResponseBody.

My custom code-

@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)

Same issue with 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 is a DTO with getters and setters and a date field that is java.util.Date.

In postman I can see the date format as :
"date": "1552476861991"

The same exact call which returns OrderWsDTO instead of List<OrderWsDTO> changes the date format. It is printing the date as 2019-03-13T12:10:05+0000 which is format : 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); } 


Why is the date showing two different formats when printed in List<DTO> and DTO?

Also, where is it getting the format : yyy-MM-dd'T'HH:mm:ss.SSXXX?


Edit 1:

The date is getting formatted here: de.hybris.platform.webservicescommons.jaxb.adapters.DateAdapter#marshal()
Format : yyyy-MM-dd'T'HH:mm:ssZ

Now, how to override this class?


Edit 2:

I am not able to override the jaxbContextFactory which has the list of adapters to modify the date. The jaxbContextFactory looks like-

<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> 

On overriding this bean in my custom code it is still picking the old values for typeAdapters. Interestingly, it is replacing other properties with my custom properties.

My custom overridden 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> 

For typeAdapters it is always picking the values-

<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> 

Edit 3:

I tried overriding the bean in mycustomaddon-web-spring.xml as -

<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> 

I have added the custom adapter class i.e. myproject.adapters.DateAdapter in acceleratoraddon/web. Did not work out though.

</div
              
     
     

Список ответов

1
 
vote

Фасоль «JaxBContextFactory» сначала определяется в веб-сервису WebServicesCommons-Spring.xml , который создает боб в контексте приложения. Поэтому, когда вы переопределите боб в своем пользовательском расширении с использованием (Customextension) -SPring.xml, он просто переопределяет боб в контексте приложения. Более подробную информацию о нагрузке контекста в Hybris можно найти здесь .

Свойство TypeAtapters, упомянутые в ваших комментариях, определено в другом компонентах, который определен в « JAXB-Converters-Spring.xml »

 <код> .x(x)7  

Поскольку бобы, определенные в JAXB-преобразователях jaxb-spream-xml , загружаются в webapplationcontext, вам нужно будет переопределить этот боб, используя (customextension) -web-spring.xml, где вы можете Определите боб и соответствующий класс в WebSRC вашего пользовательского расширения.

 

The 'jaxbContextFactory' bean is first defined in the 'webservicescommons-spring.xml' which creates the bean in the application context. So when you override the bean in your custom extension using (customExtension)-spring.xml, it is just overriding the bean in the application context. More information about context loading in Hybris can be found here.

The typeAdapters property mentioned in your comments is defined in another bean which is defined in the '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> 

Since the beans defined in the jaxb-converters-spring-xml are loaded in the WebApplicationContext, you will need to override this bean using the (customExtension)-web-spring.xml where you can define the bean and corresponding class in the websrc of your custom extension.

</div
 
 
     
     

Связанный проблема

16  Enum внутри jsp [дубликат]  ( Enum inside a jsp ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

2  Мой бар jmenu не показывает  ( My jmenu bar is not showing up ) 
Мой jmenubar не показывает, когда я запускаю свое приложение. Как я могу это исправить ?? Поэтому, когда я бегу свой Jframe, мне нужно увидеть мой jmenubar ...

-3  Как прекратить воспроизведение сервиса в Android  ( How to stop playing service in android ) 
У меня есть вопрос о сервисе и трансляции в Android.I Создайте страницу будильника, которые используя класс тревоги Reciver (он расширяет класс трансляции) дл...

3  Итализация через хесмап: «Для» петля с использованием произвольного доступа или итератора?  ( Iterating over a hashmap for loop using random access or iterator ) 
Мне нужно повторить через хешмап, чтобы извлекать значения, хранящиеся в нем. Как бонус, у меня также есть список клавиш. Поэтому у меня есть возможность по...

-1  Как установить Jlint-3.0 на Ubuntu 14.04.2? [Дубликат]  ( How to install jlint 3 0 on ubuntu 14 04 2 ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

0  Прокрутите вверх относительной макета при прокрутке вверх по просмотру  ( Scroll up relative layout when scrolling up listview ) 
Я создаю приложение. и пользовательская информация отображается в относительной макете. При относительной макете - это список с элементами, создаваемыми польз...

1  Неправильное количество прошедших args, но я передаю правильную сумму  ( Wrong number of args passed but i pass the correct amount ) 
Я использую quil с cljure и получаю странную ошибку. Я получаю ошибку <код> Exception in :draw function: #error { :cause Wrong number of args (1) pass...

1  Libgdx setscreen () сбивает игру, когда сделано несколько раз  ( Libgdx setscreen crashes game when done multiple times ) 
У меня есть <код> GameScreen и после окончания уровня, я устанавливаю экран обратно в <код> GameScreen как перезапустить , когда пользовательская кнопка пе...

1  Я хочу, чтобы мой NPC посмотреть в направлении, на котором я стою. Как бы я сделал это наиболее эффективно?  ( I want my npc to look in the direction i am standing at how would i do this mos ) 
В настоящее время я строю 2D игру с Slick2D, и сейчас я реализую свой первый NPC. У меня уже есть спрайты, я смог нарисовать его, были столкновения, и так д...

0  Java Applet Рисование формы на входе пользователя  ( Java applet drawing shapes by user input ) 
Вот то, что я хотел сделать. Есть текстовое поле, и пользователь входит в то, что он хочет. Например, «прямоугольник» или «прямоугольник», «круг» или «круг». ...

26  Как добавить кнопку в ряд jtable в качелях java  ( How to add button in a row of jtable in swing java ) 
Я сделал один важный графический интерфейс, который имел jtable с некоторыми строками и столбцами. Как я должен добавить кнопку для строки в JTable? ...

4  Ссылка метода против лямбда экспрессия  ( Method reference vs lambda expression ) 
Я хочу заменить лямбда выражение по ссылке метода в примере ниже: <код> public class Example { public static void main(String[] args) { ...

4  403 доступ запрещен на указанный URL в Tomcat 7.0.52  ( 403 access denied to specified url in tomcat 7 0 52 ) 
Я недавно мигрировал сервер Tomcat из <код> 7.0.49 на <код> 7.0.52 . В Tomcat он содержит 2 веб-приложений, которые работали ранее, после миграции на эту вер...

16  Обычная задача Android (эквивалент Cronjob)  ( Android regular task cronjob equivalent ) 
Последний раз, когда этот вопрос был задан (другим пользователем), ответ ответа был: Если это работает в беговой активности, вы можете использовать таймер ...

0  Передаваемые данные из другого потока, медленно последовательная связь с библиотекой Java и RxTx  ( Transmitting data from another thread slow serial link with java and rxtx libra ) 
<Р> Хорошо, я постараюсь быть как можно более ясно с моей проблемой. Я передача последовательных данных по veeeeeeery медленного радиоканала (с помощью UART-ко...

Связанный проблема

16  Enum внутри jsp [дубликат] 
2  Мой бар jmenu не показывает 
-3  Как прекратить воспроизведение сервиса в Android 
3  Итализация через хесмап: «Для» петля с использованием произвольного доступа или итератора? 
-1  Как установить Jlint-3.0 на Ubuntu 14.04.2? [Дубликат] 
0  Прокрутите вверх относительной макета при прокрутке вверх по просмотру 
1  Неправильное количество прошедших args, но я передаю правильную сумму 
1  Libgdx setscreen () сбивает игру, когда сделано несколько раз 
1  Я хочу, чтобы мой NPC посмотреть в направлении, на котором я стою. Как бы я сделал это наиболее эффективно? 
0  Java Applet Рисование формы на входе пользователя 
26  Как добавить кнопку в ряд jtable в качелях java 
4  Ссылка метода против лямбда экспрессия 
4  403 доступ запрещен на указанный URL в Tomcat 7.0.52 
16  Обычная задача Android (эквивалент Cronjob) 
0  Передаваемые данные из другого потока, медленно последовательная связь с библиотекой Java и RxTx