spring 带JaXb的NS2前缀

vlurs2pr  于 2023-03-28  发布在  Spring
关注(0)|答案(1)|浏览(159)

我尝试了互联网上所有的解决方案,但没有一个对我有效。ns2(ns2:Request)正在添加不同java包中的类。我已经添加了package.info,但它没有帮助。

POJO:

package com.models.response;
    @XmlRootElement(name = "Response")
    @XmlAccessorType(XmlAccessType.FIELD)
    @Data
    public class ResponseModel extends CommonModel {
    
      private static final long serialVersionUID = -865642381181292886L;
    
      @XmlElement(required = true)
      private ContentModelResponse content;
    }

package com.models.response;
@Data
@ToString(callSuper = true)
@XmlAccessorType(XmlAccessType.FIELD)
public class ContentModelResponse extends ContentModelRequest {

  @XmlElement(name = "Response", required = true)
  private ResponseModel response;
}

不同包中的类:

package com.models.request;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class ContentModelRequest {

    @XmlElement(name = "Request", required = true)
    protected RequestModel request;

}

package.info

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://uri.abc.com/ML",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    xmlns = {
      @javax.xml.bind.annotation.XmlNs(
          namespaceURI = "http://uri.abc.com/ML",
          prefix = "")
    })
package com.models.request;

响应XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BCResponse
  xmlns:ns2="http://uri.abc.com/ML">
  <publisher>
  </publisher>
  <content>
    <ns2:Request>
      <ns2:legalEntity>
        <ns2:partyId>
          <ns2:id></ns2:id>
        </ns2:partyId>
    </ns2:Request>
    <Response>
      <ResponseStatus>
        <statusType>ERROR</statusType>
      </ResponseStatus>
    </Response>
  </content>
</BCResponse>
e0bqpujr

e0bqpujr1#

溶液

  • 架构优先设计
  • Java第一设计
Schema优先设计

让我们从BCResponse的XML示例开始,为给定的元素创建XML Schema,然后JAXB可以使用其XJC编译器生成Java类。
Here是一个名为Publisher的Maven项目,使用标准的文件布局。该项目包括:

Publisher
    src
        main
            java
            resources
                Publisher-BCResponse.xsd
                Publisher-Request.xsd
                Publisher.xjb
        test
            java
                com/models/PublisherTest.java
            resources
                simplelogger.properties
            samples
                BCResponse01.xml
                BCResponse02.xml
                Request01.xml
    pom.xml

download包含一个独立的Maven项目,可以使用以下命令执行:

mvn clean test

JAXB类由该插件使用该项目的pom.xml生成

<plugin>
    <groupId>org.patrodyne.jvnet</groupId>
    <artifactId>hisrc-higherjaxb-maven-plugin</artifactId>
    <version>${hisrc-higherjaxb-maven-plugin.version}</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

并且被生成以:

target/generated-sources/xjc/

com
└── models
    ├── request
    │   ├── LegalEntity.java
    │   ├── ObjectFactory.java
    │   ├── package-info.java
    │   ├── PartyId.java
    │   └── Request.java
    └── response
        ├── BCResponse.java
        ├── Content.java
        ├── ObjectFactory.java
        ├── Response.java
        └── ResponseStatus.java
方法

Publisher-BCResponse.xsd模式不声明名称空间,并配置为使用前缀"ns2" * 导入 * Publisher-Request.xsd模式。

xmlns:ns2="http://uri.abc.com/ML"
<xs:import namespace="http://uri.abc.com/ML" schemaLocation="Publisher-Request.xsd"/>

注意:前缀是任意的,可以是"abc"
Publisher-Request.xsd模式声明其命名空间,如下所示:

xmlns:tns="http://uri.abc.com/ML"
targetNamespace="http://uri.abc.com/ML"

Publisher.xjb绑定文件配置JAXB以生成类,如下所示:

<jaxb:package name="com.models.request"/>
<jaxb:package name="com.models.response"/>
测试

JUnit测试类PublisherTest.java扫描样本文件,并调用方法checkSample(File sample)将每个文件提供给测试人员。对于此项目,创建JAXBContext,并将samples路径中的每个文件 * 解组 * 为BCResponse对象或Request对象。成功后,每个对象都被 * 封送 * 用于日志记录和review

Java First Design

在这种方法中,JAXB类是由您创建的,下面是它们的外观:

package-info.java

@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://uri.abc.com/ML")
package com.models.request;

请求.java

package com.models.request;

import java.io.Serializable;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "legalEntity" })
@XmlRootElement(name = "Request")
public class Request implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(required = true)
    protected LegalEntity legalEntity;
    public LegalEntity getLegalEntity() { return legalEntity; }
    public void setLegalEntity(LegalEntity value) { this.legalEntity = value; }
}

LegalEntity.java

package com.models.request;

import java.io.Serializable;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "partyId" })
public class LegalEntity implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(required = true)
    protected PartyId partyId;
    public PartyId getPartyId() { return partyId; }
    public void setPartyId(PartyId value) { this.partyId = value; }
}

PartyId.java

package com.models.request;

import java.io.Serializable;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "id" })
public class PartyId implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(required = true)
    protected String id;
    public String getId() { return id; }
    public void setId(String value) { this.id = value; }
}

BCResponse.java

package com.models.response;

import java.io.Serializable;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "publisher", "content" })
@XmlRootElement(name = "BCResponse")
public class BCResponse implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(required = true)
    protected String publisher;
    public String getPublisher() { return publisher; }
    public void setPublisher(String value) { this.publisher = value; }

    @XmlElement(required = true)
    protected Content content;
    public Content getContent() { return content; }
    public void setContent(Content value) { this.content = value; }
}

Content.java

package com.models.response;

import java.io.Serializable;
import com.models.request.Request;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "request", "response" })
public class Content implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(name = "Request", namespace = "http://uri.abc.com/ML", required = true)
    protected Request request;
    public Request getRequest() { return request; }
    public void setRequest(Request value) { this.request = value; }

    @XmlElement(name = "Response", required = true)
    protected Response response;
    public Response getResponse() { return response; }
    public void setResponse(Response value) { this.response = value; }
}

响应.java

package com.models.response;

import java.io.Serializable;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "responseStatus" })
public class Response implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(name = "ResponseStatus", required = true)
    protected ResponseStatus responseStatus;
    public ResponseStatus getResponseStatus() { return responseStatus; }
    public void setResponseStatus(ResponseStatus value) { this.responseStatus = value; }
}

ResponseStatus.java

package com.models.response;

import java.io.Serializable;
import jakarta.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "statusType" })
public class ResponseStatus implements Serializable
{
    private static final long serialVersionUID = 20230301L;

    @XmlElement(required = true)
    protected String statusType;
    public String getStatusType() { return statusType; }
    public void setStatusType(String value) { this.statusType = value; }
}

相关问题