Commit e3c8255a authored by duanruiming's avatar duanruiming

[add] 添加海信xml协议转化实体功能

parent dbf2b89a
package net.wanji.utc.hisense.common.enums.xml;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* @author duanruiming
* @date 2024/01/08 10:12
*/
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum MessageTypeEnum {
HEARTBEAT_STATUS(0, "心跳状态"),
LOGON_STATUS(1, "登录状态"),
SUBSCRIBE_STATUS(2, "订阅状态"),
ONLINE_STATUS(3, "联机状态"),
PAHSE_STATUS(10, "相位状态"),
UNIT_STATUS(11, "单元状态"),
COORDINATE_STATUS(12, "协调状态"),
MANUAL_CONTROL(16, "手动放案控制"),
PHASE_LOCK(18, "相位驻留控制"),
SIGNAL_TIMING(21, "信号机校时请求"),
STEP_CANCEL_CONTROL(22, "步进及取消控制"),
FOLLOW_PHASE(23, "跟随相位状态"),
FAULT_STATUS(26, "故障状态"),
CHANNEL_CONTROL(27, "通道勤务控制"),
SCHEME_RING_REQUEST(30, "方案环图请求"),
SCHEME_OPTIMIZE_CONTROL(39, "方案优化控制"),
CHANNEL_STATUS(40, "通道状态");
private int type;
private String message;
}
package net.wanji.utc.hisense.pojo.xml.pojo;
import lombok.Data;
import net.wanji.utc.hisense.common.enums.xml.MessageTypeEnum;
import javax.xml.bind.annotation.*;
import java.io.Serializable;
/**
* 海信xml消息格式体
*
* @author duanruiming
* @date 2024/01/08 10:03
*/
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "systemScription")
public class SystemScriptionRequest implements Serializable {
// 标签属性
@XmlAttribute(name = "System")
private String system = "TCIP";
@XmlAttribute(name = "Version")
private String version = "1.0";
// 实体类属性
// 子系统,海信接口服务器向外部系统发送时为Hisense
@XmlElement(name = "subSystem", defaultValue = "")
private String subSystem;
/**
* {@link MessageTypeEnum}
*/
@XmlElement(name = "messageType", defaultValue = "")
private int messageType;
// 1-请求 0-应答
@XmlElement(name = "isRequest", defaultValue = "")
private String isRequest;
// seq唯一,长度固定20, 采用YYYYMMDDHHMMSS + 6位顺序号,不足前补0
@XmlElement(name = "seq", defaultValue = "")
private String seq;
// 是否需要应答,1-需要 0-不需要
@XmlElement(name = "needResponse", defaultValue = "")
private int needResponse;
// 针对所有消息, 1-成功 0-失败
@XmlElement(name = "result", defaultValue = "")
private String result;
// 保留
@XmlElement(name = "flag", defaultValue = "")
private boolean flag;
}
package net.wanji.utc.hisense.pojo.xml.pojo.messagecontent;
import lombok.Data;
import net.wanji.utc.hisense.pojo.xml.pojo.SystemScriptionRequest;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author duanruiming
* @date 2024/01/08 16:24
*/
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "systemScription")
public class HeartBeatRequest extends SystemScriptionRequest {
private HeartBeatContent messageContent;
@Data
public static class HeartBeatContent {
}
}
package net.wanji.utc.hisense.pojo.xml.pojo.messagecontent;
import lombok.Data;
import net.wanji.utc.hisense.pojo.xml.pojo.SystemScriptionRequest;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
/**
* @author duanruiming
* @date 2024/01/08 13:24
*/
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "systemScription")
public class LogOnRequest extends SystemScriptionRequest {
private LogOnContent messageContent;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public static class LogOnContent {
private String user;
private String password;
}
}
package net.wanji.utc.hisense.util;
import lombok.extern.slf4j.Slf4j;
import net.wanji.utc.hisense.pojo.xml.pojo.messagecontent.HeartBeatRequest;
import net.wanji.utc.hisense.pojo.xml.pojo.messagecontent.LogOnRequest;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
/**
* 封装了XML转换成object,object转换成XML的代码
*
* @author duanruiming
* @date 2024/01/08 10:45
*/
@Slf4j
public class XMLUtils {
/**
* 将对象直接转换成String类型的 XML输出
*
* @param obj
* @return
*/
public static String convertToXml(Object obj) throws Exception {
// 创建输出流
StringWriter sw = new StringWriter();
try {
sw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\r");
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 去掉默认格式报文头
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
log.error("实体类对象转换xml失败:", e);
throw new Exception("实体类对象转换xml失败:", e);
}
return sw.toString();
}
public static void main(String[] args) throws Exception {
HeartBeatRequest heartBeatRequest = new HeartBeatRequest();
HeartBeatRequest.HeartBeatContent heartBeatContent = new HeartBeatRequest.HeartBeatContent();
//heartBeatRequest.setMessageContent(body);
heartBeatRequest.setMessageContent(heartBeatContent);
heartBeatRequest.setSubSystem("Hisense");
heartBeatRequest.setIsRequest("1");
System.err.println(convertToXml(heartBeatRequest));
System.err.println("================");
LogOnRequest logOnMessageContent = new LogOnRequest();
LogOnRequest.LogOnContent body = new LogOnRequest.LogOnContent();
body.setUser("user");
body.setPassword("123456");
logOnMessageContent.setMessageContent(body);
logOnMessageContent.setSubSystem("Hisense");
logOnMessageContent.setFlag(Boolean.TRUE);
logOnMessageContent.setIsRequest("");
System.err.println(convertToXml(logOnMessageContent));
}
/**
* 将对象根据路径转换成xml文件
*
* @param obj
* @param path
*/
public static String convertToXml(Object obj, String path) {
FileWriter fw = null;
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
// 创建输出流
fw = new FileWriter(path);
marshaller.marshal(obj, fw);
} catch (JAXBException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fw.toString();
}
/**
* 将String类型的xml转换成对象
*
* @param clazz
* @param xmlStr
* @return
*/
public static Object convertXmlStrToObject(Class clazz, String xmlStr) throws Exception {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
log.error("xml字符串转化实体类对象失败:", e);
throw new Exception("xml字符串转化实体类对象失败:", e);
}
return xmlObject;
}
/**
* 将file类型的xml转换成对象
*
* @param clazz
* @param xmlPath
* @return
*/
public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
FileReader fr = null;
fr = new FileReader(xmlPath);
xmlObject = unmarshaller.unmarshal(fr);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return xmlObject;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment