복붙노트

[SPRING] @ResponseBody를 통해 반환 할 때 DTO JSON에서 날짜 형식 변경

SPRING

@ResponseBody를 통해 반환 할 때 DTO JSON에서 날짜 형식 변경

@ResponseBody가 반환 한 DTO에서 날짜 형식을 변경하기 만하면됩니다.

내 질문에 내 질문은 출력이 JSON 목록이므로 JS 및 다른 UI 기능으로보기를 사용하는 대신 우편 배달부에 인쇄합니다. JSON List 만 반환하는 것이므로 Date 객체가 아니라 JSON List를 반환하기 때문에이 항목이 아닙니다.이 항목의 확장이지만 Orika 매퍼가 범인이라고 생각하지 않습니다. @ResponseBody를 사용하여 List를 반환 할 때 날짜의 타임 스탬프 값을 얻고 있습니다.

내 사용자 정의 코드 -

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

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 인 날짜 필드입니다. 우편 배달부에서 날짜 형식을 "날짜": "1552476861991"로 볼 수 있습니다.

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에서 인쇄 할 때 날짜가 두 가지 다른 형식을 나타내는 이유는 무엇입니까? 또한 형식을 얻는 위치는 어디입니까? 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>

내 사용자 지정 코드에서이 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>

typeAdapter의 경우 항상 값을 선택합니다.

<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을 재정의하려고 시도했다.

<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를 추가했습니다. 그래도 운동하지 않았다.

해결법

  1. ==============================

    1.'jaxbContextFactory'bean은 응용 프로그램 컨텍스트에서 bean을 생성하는 'webservicescommons-spring.xml'에 정의되어 있습니다. 따라서 (customExtension) -spring.xml을 사용하여 사용자 정의 확장에서 Bean을 겹쳐 쓰면 응용 프로그램 컨텍스트에서 Bean을 대체하는 것입니다. Hybris의 컨텍스트 로딩에 대한 자세한 내용은 여기를 참조하십시오.

    'jaxbContextFactory'bean은 응용 프로그램 컨텍스트에서 bean을 생성하는 'webservicescommons-spring.xml'에 정의되어 있습니다. 따라서 (customExtension) -spring.xml을 사용하여 사용자 정의 확장에서 Bean을 겹쳐 쓰면 응용 프로그램 컨텍스트에서 Bean을 대체하는 것입니다. 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 및 해당 클래스를 정의 할 수 있습니다. 맞춤 확장.

  2. from https://stackoverflow.com/questions/55141817/change-date-format-in-dto-json-on-returning-through-responsebody by cc-by-sa and MIT license