最近工作时遇到一个问题:需要将收到的报文转换为对应的对象,由于报文头(head标签)中的内容结构固定,而报文体(body标签)中的内容结构根据业务不同会发生变化,因此打算报文体使用泛型来接收,这个过程中发现泛型总是不起作用,测试代码如下:
/**
* 通用报文接收对象
* @param <T>
*/
@XmlRootElement(name = "service")
@XmlSeeAlso(testReqBody.class)
public abstract class BaseReqDto<T> {
private BaseReqHead reqHead;
@XmlAnyElement(lax = true)
private T reqBody;
@XmlElement(name = "head")
public BaseReqHead getReqHead() {
return reqHead;
}
public void setReqHead(BaseReqHead reqHead) {
this.reqHead = reqHead;
}
@XmlTransient
public T getReqBody() {
return reqBody;
}
public void setReqBody(T reqBody) {
this.reqBody = reqBody;
}
@Override
public String toString() {
return "BaseReqDto{" +
"reqHead=" + reqHead +
", reqBody=" + reqBody +
'}';
}
}
/**
* 报文头对象
*/
@XmlRootElement(name = "head")
@XmlAccessorType(XmlAccessType.FIELD)
public class BaseReqHead {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "age")
private String age;
@XmlElement(name = "sex")
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "ReqHead{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
/**
* 测试用报文体
*/
@XmlRootElement(name = "body")
@XmlAccessorType(XmlAccessType.FIELD)
public class testReqBody {
@XmlElement(name = "chinese")
public String chinese;
@XmlElement(name = "math")
public String math;
public String getChinese() {
return chinese;
}
public void setChinese(String chinese) {
this.chinese = chinese;
}
public String getMath() {
return math;
}
public void setMath(String math) {
this.math = math;
}
@Override
public String toString() {
return "testReqBody{" +
"chinese='" + chinese + '\'' +
", math='" + math + '\'' +
'}';
}
}
<?xml version="1.0" encoding="utf-8"?>
<service>
<head>
<name>lc</name>
<age>24</age>
<sex>男</sex>
</head>
<body>
<chinese>100</chinese>
<math>135</math>
</body>
</service>
报错信息:
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Could not unmarshal to [class com.example.oracle_demo.entity.BaseReqDto]: Unable to create an instance of com.example.oracle_demo.entity.BaseReqDto; nested exception is javax.xml.bind.UnmarshalException: Unable to create an instance of com.example.oracle_demo.entity.BaseReqDto
- with linked exception:
[java.lang.InstantiationException]]