使用JAVA对接跨境贸易电子商务数据交换接口拼接xml
1.首先创建一个package-info.java 其中添加一下内容
/**
* package-info.java
* 放在和实体同一个包路径下
*/
@XmlSchema(
xmlns = {
@XmlNs(prefix = "ceb", namespaceURI = NAMESPACE_CEB_URI),
@XmlNs(prefix = "xsi", namespaceURI = NAMESPACE_XSI_URI)
}
)
package com.real.common.utils.test01.model;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;
import static com.real.common.utils.test01.test02.NameSpace.NAMESPACE_CEB_URI;
import static com.real.common.utils.test01.test02.NameSpace.NAMESPACE_XSI_URI;
2.创建相应的javabean (注意:凡是需要使用命名空间作为节点的javabean,都需要和package-info.java在同一包路径下)
package com.real.common.utils.test01.model;
import lombok.Data;
import javax.xml.bind.annotation.*;
import static com.real.common.utils.test01.test02.NameSpace.NAMESPACE_CEB_URI;
/**
* Entity
*/
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "CEB311Message", namespace = NAMESPACE_CEB_URI)
public class CEB311Message {
@XmlElement(name = "Order", namespace = NAMESPACE_CEB_URI)
private Order order;
@XmlAttribute(name = "guid")
private String guid;
@XmlAttribute(name = "version")
private String version;
@XmlElement(name = "BaseSubscribe", namespace = NAMESPACE_CEB_URI)
private BaseSubscribe baseSubscribe;
@XmlElement(name = "BaseTransfer", namespace = NAMESPACE_CEB_URI)
private BaseTransfer baseTransfer;
@XmlElement(name = "ExtendMessage", namespace = NAMESPACE_CEB_URI)
private ExtendMessage extendMessage;
}
package com.real.common.utils.test01.model;
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;
import static com.real.common.utils.test01.test02.NameSpace.NAMESPACE_CEB_URI;
@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> orderList;
}
package com.real.common.utils.test01.model;
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 static com.real.common.utils.test01.test02.NameSpace.NAMESPACE_CEB_URI;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "OrderHead ", namespace = NAMESPACE_CEB_URI)
public class OrderHead {
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String guid;// 1-系统唯一序号-guid-C36-是-企业系统生成36位唯一序号(英文字母大写)。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String appType;// 2-报送类型-appType-C1-是-企业报送类型。1-新增
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String appTime;// 3-报送时间-appTime-C14-是-企业报送时间。格式:YYYYMMDDhhmmss。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String appStatus;// 4-业务状态-appStatus-C..3-是-业务状态:1-暂存,2-申报,默认为2。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String orderType;// 5-订单类型-orderType-C1-是-电子订单类型:I进口
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String orderNo;// 6-订单编号-orderNo-C..60-是-交易平台的订单编号,同一交易平台的订单编号应唯一。订单编号长度不能超过60位。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebpCode;// 7-电商平台代码-ebpCode-C..18-是-电商平台的海关注册登记编号;电商平台未在海关注册登记,由电商企业发送订单的,以中国电子口岸发布的电商平台标识编号为准。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebpName;// 8-电商平台名称-ebpName-C..100-是-电商平台的海关注册登记名称;电商平台未在海关注册登记,由电商企业发送订单的,以中国电子口岸发布的电商平台名称为准。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebcCode;// 9-电商企业代码-ebcCode-C..18-是-电商企业的海关注册登记编号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String ebcName;// 10-电商企业名称-ebcName-C..100-是-电商企业的海关注册登记名称。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String goodsValue;// 11-商品价格-goodsValue-N16,2-是-商品实际成交价,含非现金抵扣金额。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String freight;// 12-运杂费-freight-N16,2-是-不包含在商品价格中的运杂费,无则填写"0"。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String discount;// 13-非现金抵扣金额-discount-N16,2-是-使用积分、虚拟货币、代金券等非现金支付金额,无则填写"0"。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String taxTotal;// 14-代扣税款-taxTotal-N16,2-是-企业预先代扣的税款金额,无则填写“0”
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String acturalPaid;// 15-实际支付金额-acturalPaid-N16,2-是-商品价格+运杂费+代扣税款-非现金抵扣金额,与支付凭证的支付金额一致。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String currency;// 16-币制-currency-C3-是-限定为人民币,填写“142”。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String buyerRegNo;// 17-订购人注册号-buyerRegNo-C..60-是-订购人的交易平台注册号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String buyerName;// 18-订购人姓名-buyerName-C..60-是-订购人的真实姓名。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String buyerIdType;// 19-订购人证件类型-buyerIdType-C1-是-1-身份证,2-其它。限定为身份证,填写“1”。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String buyerIdNumber;// 20-订购人证件号码-buyerIdNumber-C..60-是-订购人的身份证件号码。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String payCode;// 21-支付企业代码-payCode-C..18-否-支付企业的海关注册登记编号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String payName;// 22-支付企业名称-payName-C..100-否-支付企业在海关注册登记的企业名称。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String payTransactionId;// 23-支付交易编号-payTransactionId-C..60-是-支付企业唯一的支付流水号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String batchNumbers;// 24-商品批次号-batchNumbers-C..100-否-商品批次号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String consignee;// 25-收货人姓名-consignee-C..100-是-收货人姓名,必须与电子运单的收货人姓名一致。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String consigneeTelephone;// 26-收货人电话-consigneeTelephone-C..50-是-收货人联系电话,必须与电子运单的收货人电话一致。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String consigneeAddress;// 27-收货地址-consigneeAddress-C..200-是-收货地址,必须与电子运单的收货地址一致。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String consigneeDitrict;// 28-收货地址行政区划代码-consigneeDitrict-C6-否-参照国家统计局公布的国家行政区划标准填制。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String note;// 29-备注-note-C..1000-否-
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String copNo;// 30-企业内部编号-copNo-C..20-是-企业内部标识单证的编号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String assureCode;// 31-担保企业编号-assureCode-C..30-是-担保扣税的企业海关注册登记编号,只限清单的电商平台企业、电商企业、物流企业。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String buyerTelephone;// 32-订购人电话-buyerTelephone-C..30-是-订购人电话。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String country;// 33-起运国(地区)-country-C3-是-直购进口填写起始发出国家(地区)代码,参照《JGS-20 海关业务代码集》的国家(地区)代码表;保税进口填写代码“142”。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String netWeight;// 34-净重(公斤)-netWeight-N19,5-是-货物的毛重减去外包装材料后的重量,即货物本身的实际重量,计量单位为千克。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String agentCode;// 35-报关企业海关编码-agentCode-C..18-是-点上委托报关企业的海关编码
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String logisticsCode;// 36-物流企业代码-logisticsCode-C..18-是-物流企业的海关注册登记编号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String logisticsNo;// 37-物流运单编号-logisticsNo-C..60-否-物流企业的运单包裹面单号。同一物流企业的运单编号在6个月内不重复。运单编号长度不能超过60位。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String isBuyAndPut;// 38-即买即提-isBuyAndPut-C1-是-Y:即买即提 N:不是即买即提
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String areaId;// 39-店铺海关编码-areaId-C..18-否-即买即提货物必须填写
}
package com.real.common.utils.test01.model;
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 static com.real.common.utils.test01.test02.NameSpace.NAMESPACE_CEB_URI;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "OrderList ", namespace = NAMESPACE_CEB_URI)
public class OrderList {
@XmlElement(namespace = NAMESPACE_CEB_URI)
private Integer gnum;// 1-商品序号-gnum-N2-是-从1开始的递增序号。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String itemNo;// 2-企业商品货号-itemNo-C..30-是-电商企业自定义的商品货号(SKU)。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String itemName;// 3-企业商品名称-itemName-C..250-是-交易平台销售商品的中文名称。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String itemDescribe;// 4-企业商品描述-itemDescribe-C..1000-否-交易平台销售商品的描述信息。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String barCode;// 5-条形码-barCode-C..50-否-国际通用的商品条形码,一般由前缀部分、制造厂商代码、商品代码和校验码组成。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String unit;// 6-单位-unit-C3-是-填写海关标准的参数代码,参照《JGS-20 海关业务代码集》- 计量单位代码。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String qty;// 7-数量-qty-N16,2-是-商品实际数量。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String price;// 8-单价-price-N16,2-是-商品单价。赠品单价填写为“0”。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String totalPrice;// 9-总价-totalPrice-N16,2-是-商品总价,等于单价乘以数量。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String currency;// 10-币制-currency-C3-是-限定为人民币,填写“142”。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String country;// 11-原产国-country-C3-是-填写海关标准的参数代码,参照《JGS-20 海关业务代码集》-国家(地区)代码表。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String note;// 12-备注-note-C..1000-否-促销活动,商品单价偏离市场价格的,可以在此说明。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String gcode;// 13-商品编码-gcode-C10-是-按商品分类编码规则确定的进出口商品的商品编号,分为商品编号和附加编号,其中商品编号栏应填报《中华人民共和国进出口税则》8位税则号列,附加编号应填报商品编号,附加编号第9、10位。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String gmodel;// 14-商品规格型号-gmodel-C..250-是-满足海关归类、审价以及监管的要求为准。包括:品牌、规格、型号等。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String qty1;// 15-法定数量-qty1-N19,5-是-按照商品编码规则对应的法定计量单位的实际数量填写。
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String unit1;// 16-法定计量单位-unit1-C3-是-海关标准的参数代码 《JGS-20 海关业务代码集》- 计量单位代码
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String unit2;// 17-第二法定单位-unit2-C3-否-海关标准的参数代码 《JGS-20 海关业务代码集》- 计量单位代码
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String qty2;// 18-第二法定数量-qty2-N19,5-否-
@XmlElement(namespace = NAMESPACE_CEB_URI)
private String gname;// 19-商品名称-gname-C..250-是-商品名称应据实填报,与电子订单一致。
}
3.运行文件及其他内容如下
package com.real.common.utils.test01.test02;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
* Jaxb2工具类
*
* @author zhuc
* @create 2013-3-29 下午2:40:14
*/
public class JaxbUtil {
/**
* JavaBean转换成xml
* 默认编码UTF-8
*
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
return convertToXml(obj, "UTF-8");
}
/**
* JavaBean转换成xml
*
* @param obj
* @param encoding
* @return
*/
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();
writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "\n "); // 由于不能优雅的去掉 standalone="yes" 所以只能去掉整个头部,然后手动插入一个符合条件的头部 该行为不优雅需要进行升级
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* xml转换成JavaBean
*
* @param xml
* @param c
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T converyToJavaBean(String xml, Class<T> 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;
}
}
package com.real.common.utils.test01.test02;
public class NameSpace {
public static final String NAMESPACE_CEB_URI = "http://www.chinaport.gov.cn/ceb";
public static final String NAMESPACE_XSI_URI = "http://www.w3.org/2001/XMLSchema-instance";
}
package com.real.common.utils.test01.test02;
import com.real.common.utils.test01.model.CEB311Message;
import com.real.common.utils.test01.model.Order;
import com.real.common.utils.test01.model.OrderHead;
import com.real.common.utils.test01.model.OrderList;
import org.junit.Test;
import javax.xml.bind.JAXBException;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhuc
* @create 2013-3-29 下午2:50:00
*/
public class JaxbTest1 {
/**
* @throws JAXBException
*/
@Test
public void showMarshaller() {
CEB311Message ceb311Message = new CEB311Message();
ceb311Message.setGuid("556E1CFD-EDED-46B1-946C-B8022E42FC94");
ceb311Message.setVersion("1.0");
Order order = new Order();
OrderHead orderHead = new OrderHead();
orderHead.setGuid("556E1CFD-EDED-46B1-946C-B8022E42FC94");
order.setOrderHead(orderHead);
List<OrderList> orderList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
OrderList orderItem = new OrderList();
orderItem.setCurrency(i + "");
orderItem.setCountry(i + "");
orderList.add(orderItem);
}
order.setOrderList(orderList);
ceb311Message.setOrder(order);
String str = JaxbUtil.convertToXml(ceb311Message);
System.out.println(str);
}
}
4.其结果如下
<?xml version="1.0" encoding="UTF-8"?>
<ceb:CEB311Message guid="556E1CFD-EDED-46B1-946C-B8022E42FC94" version="1.0" xmlns:ceb="http://www.chinaport.gov.cn/ceb" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ceb:Order>
<ceb:OrderHead>
<ceb:guid>556E1CFD-EDED-46B1-946C-B8022E42FC94</ceb:guid>
</ceb:OrderHead>
<ceb:OrderList>
<ceb:currency>0</ceb:currency>
<ceb:country>0</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>1</ceb:currency>
<ceb:country>1</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>2</ceb:currency>
<ceb:country>2</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>3</ceb:currency>
<ceb:country>3</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>4</ceb:currency>
<ceb:country>4</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>5</ceb:currency>
<ceb:country>5</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>6</ceb:currency>
<ceb:country>6</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>7</ceb:currency>
<ceb:country>7</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>8</ceb:currency>
<ceb:country>8</ceb:country>
</ceb:OrderList>
<ceb:OrderList>
<ceb:currency>9</ceb:currency>
<ceb:country>9</ceb:country>
</ceb:OrderList>
</ceb:Order>
</ceb:CEB311Message>
希望以上内容对大家有用