求大神路过,JAXB怎样处理动态集合啊?

「已注销」 「已注销」 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
就是当我用JAXB转xml字符串为java对象时,里面包含有集合对象。但是集合对象中的类型又不固定。

我想用java的多态来实现,但是好像JAXB并不能识别。

简单核心代码如下:


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import com.keer.common.domain.ListBean;
import com.keer.common.domain.Person;

public class Test{

private JdbcTemplate jdbcTemplate;

//这是Test类型
public String getAc01All() {
String sql ="select aac001,aac002,aac003 from ac01";
List<Person> list = jdbcTemplate.query(sql, new RowMapper<Person>(){
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
Person p = new Person();
p.setAac001(rs.getString("aac001"));
p.setAac002(rs.getString("aac002"));
p.setAac003(rs.getString("aac003"));
return p;
}
});
ListBean<Person> lb = new ListBean<Person>();

String s =list2XML(lb.getClass(),list);

System.out.println(s);
return s;
}


public String list2XML(Class<?> cla,List<?> list,Class<?> clas){
StringWriter writer = new StringWriter();
ListBean lb =null;
try {

Object o=cla.newInstance();
if(o instanceof ListBean){
lb = (ListBean)o;
lb.setList(list);
}
JAXBContext context = null;
if(null != clas){
context = JAXBContext.newInstance(cla,clas);
}else{
context = JAXBContext.newInstance(cla);
}

marshallXmlType(lb, writer);
} catch (Exception e) {
e.printStackTrace();
}
return writer.toString();
}


public static <T> void marshallXmlType(T value, Writer os) {
try {
Class<T> clzz = (Class<T>)value.getClass();
JAXBContext context = JAXBContext.newInstance(clzz);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
m.setAdapter(ListAdapter.class,new ListAdapter<Person>());
QName name = new QName(clzz.getSimpleName());
JAXBElement<T> element = new JAXBElement<T>(name, clzz, value);
m.marshal(element, os);
} catch (JAXBException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
System.out.println(new PersonInfo().getAc01All());
}
}

//List模型类

import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name = "ListBean")
public class ListBean<T> {

private String name;
private List<T> list;

@XmlJavaTypeAdapter(ListAdapter.class)
public List<T> getList() {
return list;
}

public void setList(List<T> list) {
this.list = list;
}

@XmlAttribute
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//模型类

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 javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "Person")
public class Person extends Domain {

@XmlElement(required = true)
protected String aac001;
@XmlElement(required = true)
protected String aac002;
@XmlElement(required = true)
protected String aac003;
}

//xml2集合转换类
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ListAdapter<T extends Domain> extends XmlAdapter<Domain [], List<Domain>> {

public T [] marshal(List<Domain> domains) throws Exception {
Domain [] dos = new Domain[domains.size()];
int i = 0;
for (Domain domain : domains) {
dos[i++] = domain;
System.out.println(domain.getClass().getSimpleName());
}
return (T[]) dos;
}

public List<Domain> unmarshal(Domain [] paramValueType) throws Exception {
List<Domain> list = new ArrayList<Domain>();
for (Domain domain : list) {
list.add(domain);
}
return list;
}
}

//抽象模型类

import java.io.Serializable;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Domain")
public class Domain implements Serializable {
private static final long serialVersionUID = -3851152784887793734L;
}



期望输出的xml格式内容为:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ListBean>
<Domain>
<aac001>3001415720</aac001>
<aac002>542336197608166802</aac002>
<aac003>巴桑</aac003>
</Domain>
<Domain>
<aac001>3001415721</aac001>
<aac002>542336196407126826</aac002>
<aac003>罗布卓玛</aac003>
</Domain>
<Domain>
<aac001>3001415722</aac001>
<aac002>542336196507030020</aac002>
<aac003>普珍</aac003>
</Domain>
</ListBean>


但是现在代码的输出是这样:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ListBean>
<list>
<item/>
<item/>
<item/>
</list>
</ListBean>
...全文
评论 4
收藏 已收藏
分享
返回顶部
「已注销」
Java 51,407 成员 86,131 内容