繁体   English   中英

在Spring MVC中,对于请求正文使用Jaxb批注的正确配置是什么?

[英]In Spring MVC, what is the correct configuration for using Jaxb annotations for request body?

当前,我有一个RESTful服务,并且我正在尝试反序列化POST请求正文(即XML),但无法正常工作。 我已经尝试了所有解决方案,但似乎都没有用。 JSON与Spring MVC完美配合,但是要使XML正常工作是很痛苦的。

我正在使用Spring 5.1.5版本,并使用Jaxb进行编组和反编组。

以下是我目前拥有的:

这是我的spring mvc配置:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">


    <context:component-scan base-package="my.project.controllers" />

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
                <property name="objectMapper" ref="xmlMapper"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
          p:indentOutput="true"
          p:simpleDateFormat="yyyy-MM-dd"
          p:modulesToInstall="com.fasterxml.jackson.module.paramnames.ParameterNamesModule"/>

    <bean id="xmlMapper" parent="objectMapper" p:createXmlMapper="true"/>
</beans>

这些是我的pom.xml依赖项:

        <!-- Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.guice</groupId>
            <artifactId>spring-guice</artifactId>
            <version>${spring.guice.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>

        <!-- Logging -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${sl4j-log4j.version}</version>
        </dependency>

        <!-- Other dependencies -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>${javax.annotation.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>${guice.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>

这是我的RestController

@RestController
@RequestMapping("issuance")
public class ProtocolController {

    @Autowired
    private IssuerManager issuerManager;

    @PostMapping(value = "init", produces = "application/xml", consumes = "application/xml")
    public IssuanceMessageAndBoolean initializeIssuance(@RequestBody final IssuancePolicyAndAttributes ipaa) throws CryptoEngineException {
        IssuanceMessageAndBoolean imab = issuerManager.initializeIssuanceProtocol(ipaa);
        return imab;
    }

这是我要反序列化的对象( IssuancePolicyAndAttributes ):


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "IssuancePolicyAndAttributes",
    namespace = "http://abc4trust.eu/wp2/abcschemav1.0",
    propOrder = {"issuancePolicy", "attribute"}
)
@XmlRootElement(
    name = "IssuancePolicyAndAttributes"
)
public class IssuancePolicyAndAttributes implements Serializable {
    private static final long serialVersionUID = 6699648078303838561L;
    @XmlElement(
        name = "IssuancePolicy",
        namespace = "http://abc4trust.eu/wp2/abcschemav1.0",
        required = true
    )
    protected IssuancePolicy issuancePolicy;
    @XmlElement(
        name = "Attribute",
        namespace = "http://abc4trust.eu/wp2/abcschemav1.0"
    )
    protected List<Attribute> attribute;

    public IssuancePolicyAndAttributes() {
    }

    public IssuancePolicy getIssuancePolicy() {
        return this.issuancePolicy;
    }

    public void setIssuancePolicy(IssuancePolicy value) {
        this.issuancePolicy = value;
    }

    public List<Attribute> getAttribute() {
        if (this.attribute == null) {
            this.attribute = new ArrayList();
        }

        return this.attribute;
    }
}

这是我作为请求正文发送的XML:

<abc:IssuancePolicyAndAttributes
        xmlns:abc="http://abc4trust.eu/wp2/abcschemav1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://abc4trust.eu/wp2/abcschemav1.0 ../../../../../../../../abc4trust-xml/src/main/resources/xsd/schema.xsd">

    <abc:IssuancePolicy Version="1.0">
        <abc:PresentationPolicy PolicyUID="http://ticketcompany.com/tickets/issuance/policy">
            <abc:Pseudonym Exclusive="true" Scope="http://ticketcompany.com/tickets/vip" Established="false"
                           Alias="#nym"/>
            <abc:Message>
                <abc:Nonce>KNsRu9cGzkaeabogeRVV</abc:Nonce>
                <abc:ApplicationData>
                    <abc:TestApplicationData>
                        <abc:Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                                  xsi:type="xs:string">Some data
                        </abc:Data>
                    </abc:TestApplicationData>
                </abc:ApplicationData>
            </abc:Message>
        </abc:PresentationPolicy>

        <abc:CredentialTemplate SameKeyBindingAs="#nym">
            <abc:CredentialSpecUID>http://MyFavoriteSoccerTeam/tickets/vip</abc:CredentialSpecUID>
            <abc:IssuerParametersUID>http://ticketcompany/MyFavoriteSoccerTeam/issuance:idemix</abc:IssuerParametersUID>
            <abc:UnknownAttributes/>
        </abc:CredentialTemplate>
    </abc:IssuancePolicy>

    <abc:Attribute>
        <abc:AttributeUID>-5027215341191833963</abc:AttributeUID>
        <abc:AttributeDescription DataType="xs:string" Encoding="urn:abc4trust:1.0:encoding:string:sha-256"
                                  Type="FirstName">
            <abc:FriendlyAttributeName lang="en">first name</abc:FriendlyAttributeName>
            <abc:FriendlyAttributeName lang="da">fornavn</abc:FriendlyAttributeName>
        </abc:AttributeDescription>
        <abc:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">John
        </abc:AttributeValue>
    </abc:Attribute>
    <abc:Attribute>
        <abc:AttributeUID>-2715953330829768453</abc:AttributeUID>
        <abc:AttributeDescription DataType="xs:string" Encoding="urn:abc4trust:1.0:encoding:string:sha-256"
                                  Type="LastName">
            <abc:FriendlyAttributeName lang="en">last name</abc:FriendlyAttributeName>
            <abc:FriendlyAttributeName lang="da">efternavn</abc:FriendlyAttributeName>
        </abc:AttributeDescription>
        <abc:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Dow
        </abc:AttributeValue>
    </abc:Attribute>
    <abc:Attribute>
        <abc:AttributeUID>-2231744817504418816</abc:AttributeUID>
        <abc:AttributeDescription DataType="xs:date" Encoding="urn:abc4trust:1.0:encoding:date:unix:signed"
                                  Type="Birthday">
            <abc:FriendlyAttributeName lang="en">birthday</abc:FriendlyAttributeName>
            <abc:FriendlyAttributeName lang="da">fødselsdag</abc:FriendlyAttributeName>
        </abc:AttributeDescription>
        <abc:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1985-05-05Z
        </abc:AttributeValue>
    </abc:Attribute>
    <abc:Attribute>
        <abc:AttributeUID>-2231744817504418826</abc:AttributeUID>
        <abc:AttributeDescription DataType="xs:date" Encoding="urn:abc4trust:1.0:encoding:date:unix:signed"
                                  Type="Matchday">
            <abc:FriendlyAttributeName lang="en">Match day</abc:FriendlyAttributeName>
            <abc:FriendlyAttributeName lang="da">Kamp dag</abc:FriendlyAttributeName>
        </abc:AttributeDescription>
        <abc:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2013-08-07Z
        </abc:AttributeValue>
    </abc:Attribute>
    <abc:Attribute>
        <abc:AttributeUID>-1231744817504418817</abc:AttributeUID>
        <abc:AttributeDescription Type="MemberNumber" DataType="xs:integer"
                                  Encoding="urn:abc4trust:1.0:encoding:integer:unsigned">
            <abc:FriendlyAttributeName lang="en">VIP member id</abc:FriendlyAttributeName>
            <abc:FriendlyAttributeName lang="da">VIP medlems nummer</abc:FriendlyAttributeName>
        </abc:AttributeDescription>
        <abc:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:integer">23784638726
        </abc:AttributeValue>
    </abc:Attribute>
</abc:IssuancePolicyAndAttributes>

当我调试,并检查变量的值ipaa中的RestController ,变量本身被实例化,但其所有成员都为空,这表明反编排不正确的发生。

我究竟做错了什么?

更改xml元素的名称

@XmlElement(name = "abc:IssuancePolicy", namespace = "http://abc4trust.eu/wp2/abcschemav1.0", required = true)
protected IssuancePolicy issuancePolicy;

@XmlElement(name = "abc:Attribute", namespace = "http://abc4trust.eu/wp2/abcschemav1.0")
protected List<Attribute> attribute;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM