SAP Hybris将doctype添加到cXML Punchout

问题描述

当前,我们的cXML Punchout实现(SAP hybris标准)未在响应上打印Doctype。
终端系统需要它:

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标头中。但它永远不会运行。
对我来说,弹簧配置看起来正确:

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

现在,我们知道别名将起作用并且响应将包含文档类型:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...