近期在对接海关的订单出口报文,从网上找了挺多的案例,下面做一个记录
1、文件目录结构如下图所示
2、各文件代码
2.1、NameSpace类
public class NameSpace {
public static final String NAMESPACE_CEB_URI = "http://www.chinaport.gov.cn/ceb";
public static final String NAMESPACE_DXP_URI = "http://www.chinaport.gov.cn/dxp";
public static final String NAMESPACE_XSI_URI = "http://www.w3.org/2001/XMLSchema-instance";
public static final String NAMESPACE_DS_URL = "http://www.w3.org/2000/09/xmldsig#";
}
2.2、xml工作空间类 package-info.java
@XmlSchema(
xmlns = {
@XmlNs(prefix = "ceb", namespaceURI = NAMESPACE_CEB_URI),
@XmlNs(prefix = "xsi", namespaceURI = NAMESPACE_XSI_URI)
}
)
package com.ruoyi.online.request.order;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;
2.3、订单出口报文CEB303Message
import lombok.Data;
import javax.xml.bind.annotation.*;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "CEB303Message" , namespace = NAMESPACE_CEB_URI)
public class CEB303Message {
@XmlElement(name = "Order", namespace = NAMESPACE_CEB_URI)
private Order order;
@XmlAttribute(name = "guid")
private String guid;
@XmlAttribute(name = "version")
private String version;
@XmlElement(name = "baseTransfer", namespace = NAMESPACE_CEB_URI)
private baseTransfer baseTransfer;
//@XmlElement(name = "baseSubscribe", namespace = NAMESPACE_CEB_URI)
//private baseSubscribe baseSubscribe;
//
//@XmlElement(name = "ExtendMessage", namespace = NAMESPACE_CEB_URI)
//private ExtendMessage extendMessage;
}
2.4、订单业务节点类
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Order ", namespace = NAMESPACE_CEB_URI)
public class Order {
@XmlElement(name = "OrderHead", namespace = NAMESPACE_CEB_URI)
private OrderHead orderHead;
@XmlElement(name = "OrderList", namespace = NAMESPACE_CEB_URI)
private List orderList;
}
#订单头类
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "OrderHead ", namespace = NAMESPACE_CEB_URI)
public class OrderHead {
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String guid;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String appType;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String appTime;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String appStatus;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String orderType;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String orderNo;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebpCode;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebpName;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebcCode;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebcName;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private BigDecimal goodsValue;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private BigDecimal freight;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String currency;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String note;
}
#订单列表
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.math.BigDecimal;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "OrderList ", namespace = NAMESPACE_CEB_URI)
public class OrderList {
@XmlElement(namespace = NAMESPACE_CEB_URI)
private Integer gnum;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String itemNo;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String itemName;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String itemDescribe;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String barCode;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String unit;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String currency;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private Integer qty;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private BigDecimal price;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private BigDecimal totalPrice;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String note;
}
2.5、基础报文传输实体
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "baseTransfer ", namespace = NAMESPACE_CEB_URI)
public class baseTransfer {
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String copCode;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String copName;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String dxpMode;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String dxpId;
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String note;
}
3、将出口订单实体转化为xml 报文工具类 JaxbUtils
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
public class JaxbUtils {
public static String convertToXml(Object obj) {
return convertToXml(obj, "UTF-8");
}
public static String convertToXml(Object obj, String encoding) {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
//格式化xml格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
//去掉生成xml的默认报文头
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
// 由于不能优雅的去掉 standalone="yes" 所以只能去掉整个头部,然后手动插入一个符合条件的头部 该行为不优雅需要进行升级
writer.append("" + "n");
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@SuppressWarnings("unchecked")
public static T converyToJavaBean(String xml, Class c) {
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}



