Spring SAP Hybris向cXML Punchout添加Doctype
目前,我们的cXML Punchout实现(SAP hybris标准)没有在响应上打印Doctype。Spring SAP Hybris向cXML Punchout添加Doctype,spring,hybris,doctype,spring-bean,cxml,Spring,Hybris,Doctype,Spring Bean,Cxml,目前,我们的cXML Punchout实现(SAP hybris标准)没有在响应上打印Doctype。 endsyste需要它: Wed Sep 02 00:19:42 PDT 2020 (T12:prealm_1234:global\c1234:PasswordAdapter1:db2wer:C123_UI1) (application.cxml:ERROR) [ID1234]: CXMLDOMRequester: Unable to parse cXML response with
endsyste需要它:
Wed Sep 02 00:19:42 PDT 2020 (T12:prealm_1234:global\c1234:PasswordAdapter1:db2wer:C123_UI1)
(application.cxml:ERROR) [ID1234]: CXMLDOMRequester: Unable to parse cXML response with error:
org.xml.sax.SAXParseException: Document root element "cXML", must match DOCTYPE root "null".
我试图做一些研究:
一个请求转到
de.hybris.platform.b2bpunchoutaddon.controllers.pages.DefaultPunchOutSetUpController.handlePunchOutSetUpRequest()
,并返回一个CXML对象。这个对象经过一些映射器和转换器,但是在Doctype中没有添加任何内容
然后我找到了de.hybris.platform.b2bpunchoutaddon.converter.CXMLJaxb2MessageConverter
。此MessageConverter
将Doctype添加到xml头中。但它从不运行。对我来说,spring配置看起来是正确的:
<alias name="cXMLJaxb2MessageConverter" alias="jaxbMessageConverter" />
<bean id="cXMLJaxb2MessageConverter" class="de.hybris.platform.b2bpunchoutaddon.converter.CXMLJaxb2MessageConverter"/>
现在我对这个问题感到绝望。你们中有人知道如何修复它吗?这是因为在店面扩展中,您有以下消息转换器设置:
<!-- activates annotation driven binding -->
<mvc:annotation-driven ignore-default-model-on-redirect="true" validator="validator">
<mvc:message-converters>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
因此,这个spring配置当然会忽略b2bpunchoutaddon创建的bean
<alias name="cXMLJaxb2MessageConverter" alias="jaxbMessageConverter" />
<bean id="cXMLJaxb2MessageConverter" class="de.hybris.platform.b2bpunchoutaddon.converter.CXMLJaxb2MessageConverter"/>
对此,我的修复方法是使用将我的店面spring mvc配置更改为使用id=“jaxbMessageConverter”的bean,而不是内联bean:
<bean id="jaxbMessageConverter" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
<!-- activates annotation driven binding -->
<mvc:annotation-driven ignore-default-model-on-redirect="true" validator="validator">
<mvc:message-converters>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
<ref bean="jaxbMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
现在,我们知道别名将起作用,响应将包含doctype:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.2.024/cXML.dtd">
<cXML payloadID="1609762719111.6059@DESKTOP-3HR841G" timestamp="2021-01-04T14:18:39+02:00" xml:lang="en-US">
<Response>
<Status code="200" text="success"/>
<PunchOutSetupResponse>
<StartPage>
<URL>foo.bar.bla</URL>
</StartPage>
</PunchOutSetupResponse>
</Response>
</cXML>
foo.bar.bla