引言
上一篇博客中介绍了怎么获得签名,在这篇博客中将介绍如何采用注解方式将JavaBean转换为XML并采用AES全报文加密。
首先看一下生成的xml报文格式。
<?xml version="1.0" encoding="utf-8"?>
<Message>
<Sys_Head>
<TRAN_CODE>CMS02CMS658</TRAN_CODE>
<SEQ_NO>24080348632126308944</SEQ_NO>
<CHL_ID>BJRXZQKJ00</CHL_ID>
<TRAN_DATE>20190819</TRAN_DATE>
<TRAN_TIMESTAMP>7594000</TRAN_TIMESTAMP>
</Sys_Head>
<ARRAYLIST>
<SERIALNO>T20190818040100778115546</SERIALNO>
<CALLSTATUS>1</CALLSTATUS>
<CALLTIME>2019/08/19 10:06:06</CALLTIME>
<TALKTIME>08:00:28</TALKTIME>
<CALLRESULTCODE>15</CALLRESULTCODE>
<CALLRESULTDES>询问是否本人</CALLRESULTDES>
<ISONESELF>2</ISONESELF>
<ISINUSE>1</ISINUSE>
</ARRAYLIST>
</Body>
</Message>
通过注解的方式进行转换,主要是在定义实体的时候,采用正确的注解即可。
1、第一级节点Message
package com.jack.urgerobot.callback.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
* @author zhenghao
* @description:
* @date 2019/7/3011:18
@XmlRootElement(name = "Message")
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
@XmlElement(name ="Sys_Head")
private com.jack.urgerobot.callback.model.Head Head;
@XmlElement(name ="Body")
private Body body;
public com.jack.urgerobot.callback.model.Head getHead() {
return Head;
public void setHead(com.jack.urgerobot.callback.model.Head head) {
Head = head;
public Body getBody() {
return body;
public void setBody(Body body) {
this.body = body;
}
2、Head节点
package com.jack.urgerobot.callback.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
* @author zhenghao
* @description:
* @date 2019/7/2612:01
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Head {
* 交易码
private String TRAN_CODE;
* 流水号
private String SEQ_NO;
* 请求方身份id
private String CHL_ID = "BJRXZQKJ00";
* 交易日期 20181129
private String TRAN_DATE;
* 交易时间
private String TRAN_TIMESTAMP;
private String SIGNATURE;
//set get 方法省略
}
3、Body节点
package com.jack.urgerobot.callback.model;
import javax.xml.bind.annotation.*;
import java.util.List;
* @author zhenghao
* @description:
* @date 2019/7/2612:01
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Body {
@XmlElementWrapper(name = "ARRAYLIST")
@XmlElement(name ="Row")
private List<Row> row ;
public List<Row> getRow() {
return row;
public void setRow(List<Row> row) {
this.row = row;
}
4、row节点
package com.jack.callback.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
* @author zhenghao
* @description:
* @date 2019/8/517:34
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Row {
* 案件流水号
private String SERIALNO;
* 接听状态 码值:1-接通 2-未接通
private String CALLSTATUS;
* 呼叫时间 yyyy/MM/dd HH:mm:ss
private String CALLTIME;
* 通话时间 HH:mm:ss
private String TALKTIME;
* 案件结果码值
private String CALLRESULTCODE;
* 通话结果描述
private String CALLRESULTDES;
* 承诺还款时间 yyyy/MM/dd
private String PROMISEDATE;
* 是否本人 码值:1-是 2-否
private String ISONESELF;
* 号码是否有效 码值:1-有效 2-无效
private String ISINUSE;
//set get 省略
}
5、工具类代码
package com.jack.common.utils;
import org.apache.poi.ss.formula.functions.T;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import java.io.StringWriter;
* @author zhenghao
* @description:
* @date 2019/7/2611:21
public class XmlUtils {
public static String beanToXml(Object obj, String encoding) throws JAXBException {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
} catch (Exception e) {
e.printStackTrace();
return result;
}
6、调用测试
Message message = new Message();
message.setBody(body);
message.setHead(head);
String strXml = XmlUtils.beanToXml(message, "UTF-8");
到这生成xml的代码完成
7、AES加密工具类
package com.jack.common.utils;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* @author zhenghao
* @description: 加密
* @date 2019/7/3015:06
public class EncryptUntils {
private static Logger log = LoggerFactory.getLogger(EncryptUntils.class);
public static String encrypt(String keyStr, String datastr) {
String s = null;
try {
Key key = generateKey(keyStr);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] decrypt = cipher.doFinal(datastr.getBytes());
byte[] decrypt1 = Base64.encodeBase64(decrypt);
s = new String(decrypt1);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
log.info("加密失败" + e.getMessage());
return s;
* @Description: 解密
* @author: zhenghao
* @date: 2019/7/30 15:13
public static String Decrypt(String keyStr, String datastr) {
String s = null;
try {
Key key = generateKey(keyStr);
Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher1.init(Cipher.DECRYPT_MODE, key);
byte[] decrypt2 = cipher1.doFinal(Base64.decodeBase64(datastr));
s = new String(decrypt2);
} catch (Exception e) {
e.printStackTrace();
log.info("解密失败" + e.getMessage());
return s;
private static Key generateKey(String key) throws Exception {
try {
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
return keySpec;
} catch (Exception e) {
e.printStackTrace();
throw e;
public static void main(String[] args) {
// TODO Auto-generated method stub
String keyStr = "D3BF52E111B8F129";
String datastr = "q8DtrPAfnJ/awzRnW44ui4YSQ/VIsm/5YdOn9lWFi8f1OTGH+3UNGnZRlRIvUXhTgJu8Y8F9yFIPLftxhgjvYz3cS9qrpo08/8gRT4xtXwFuWse+mc5J9Gt5Qf1U/aDCerV744NB1uzfOaG1umIGemR7vwyNCY88xGw3w0+iIpBNBg+bvbJ5j8GZv+owIkJf+mcUUqVFNXeaO+yFGmHHfg17iIdrSTQRYBAAO9Dx2+/tuvbep8QiXXrl2yMZfrByXooxIGxI1DOxwZl0qskuE/QWb5ePYTdkcdETQz/F1xx/1c9eEN1BGtP4YrVg0EhZx3ZqTlz3fFC4ns/r+8MutnyF2QzVhZLsI1ec1Qd0CbA59A4ivEHpxhmxk61yyhZ7IyxC7UZfS5O8vRVVB7deC33VTyxvCfq/wKnGZnCK2xYH6VVKwvl8GifDVneU57zf0Bi8wlSQ7VR11LwFuom00ICP/aDzKtfxSZtPsELaXkY=";
Key key = generateKey(keyStr);
// Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// cipher.init(Cipher.ENCRYPT_MODE, key);
// byte[] decrypt = cipher.doFinal(datastr.getBytes());
// byte[] decrypt1 =Base64.encodeBase64(decrypt);
// System.out.println(new String(decrypt1));
Cipher cipher1 = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher1.init(Cipher.DECRYPT_MODE, key);
byte[] decrypt2 = cipher1.doFinal(Base64.decodeBase64(datastr));
System.out.println(new String(decrypt2));
}catch(Exception e){
e.printStackTrace();
}
8、最后我们将生成xml字符串和约定的加密key传入到加密方法中即可完成加密操作