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

snzke 2012-04-16 10:54:43
就是当我用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>
...全文
377 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-04-17
  • 打赏
  • 举报
回复
谢谢你啦 cseu 。问题解决了,原来是我的Person对象里面有多余的注解,而且转换方式也不一样。现在好了。真心感谢你!
cseu 2012-04-16
  • 打赏
  • 举报
回复
基于你的代码

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

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

private String name;
private List<T> list;

@XmlElement(name = "Domain")
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.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String[] args) {
Person person = new Person();
person.aac001="aac001";
person.aac002="aac002";
person.aac003="aac003";

List<Person> personList = new ArrayList<Person>();
personList.add(person);

ListBean<Person> listBean = new ListBean<Person>();
listBean.setList(personList);

try {
JAXBContext context = JAXBContext.newInstance(ListBean.class, Person.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
m.marshal(listBean,outputStream);
System.out.println(outputStream);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}

其他Domain,Person类一样
我这里跑出来结果是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ListBean>
<Domain xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<aac001>aac001</aac001>
<aac002>aac002</aac002>
<aac003>aac003</aac003>
</Domain>
</ListBean>
「已注销」 2012-04-16
  • 打赏
  • 举报
回复
大神啊我照你说的那样做了,但是要报错:

[javax.xml.bind.JAXBException: class com.keer.common.domain.Person nor any of its super class is known to this context.]


你能不能写一个小小的demo啊,小demo就行了,谢谢
cseu 2012-04-16
  • 打赏
  • 举报
回复
泛型类型是可以识别的
要达到你的效果,可以这样改
in ListBean

@XmlElement(name = "Domain")
public List<T> getList() {
return list;
}

获取JAXBContext时,

JAXBContext context = JAXBContext.newInstance(ListBean.class,Person.class);

其他不必要的代码都可以删除
内容概要:本文围绕基于CNN-BiLSTM-Attention混合神经网络模型的电力负荷预测展开研究,提出一种结合卷积神经网络(CNN)、双向长短期记忆网络(BiLSTM)与注意力机制(Attention)的深度学习框架,并通过Python代码实现高精度的短期与超短期负荷预测。该模型充分利用CNN对局部特征的提取能力,捕捉负荷数据中的周期性与趋势性模式;借助BiLSTM对时间序列前后向依赖关系的建模能力,增强对动态变化的感知;并通过Attention机制自适应地聚焦关键历史时刻,提升预测准确性。文中详细阐述了数据预处理、模型结构设计、训练流程及超参数调优方法,并在真实负荷数据集上进行了实验验证,结果表明该混合模型相比传统单一模型和其他基准模型具有更优的预测性能,尤其在应对非线性、非平稳负荷波动方面表现突出。; 适合人群:具备一定Python编程能力和机器学习基础,从事电力系统分析、能源管理、智能电网或时序预测相关工作的科研人员、工程师及高校研究生。; 使用场景及目标:①应用于电网调度、电力市场出清、需响应管理等场景下的精细化负荷预测;②为研究人员提供一套完整的、可复现的深度学习负荷预测代码框架,推动AI技术在能源领域的落地应用;③帮助理解CNN、BiLSTM与Attention模块之间的协同机制及其在时序建模中的集成方式。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点掌握数据归一化、滑动窗口构造、模型搭建与训练技巧,并尝试在不同地区、不同季节的负荷数据上进行迁移测试,以深入理解模型泛化能力与调参策略。
内容概要:本文围绕“MATLAB具有储能的经济调度及机会约束和鲁棒优化”展开,系统研究了电力系统中融合储能技术的经济调度问题,重点探讨了机会约束规划与鲁棒优化方法在应对新能源出力不确定性、负荷波动及系统运行风险中的应用。内容涵盖风光储协同调度、多微网共享储能、电动汽车参与调度、低碳经济调度等多种典型场景,深入分析了储能的选址定容、功率协调控制、状态估计与优化调度模型。核心技术包括粒子群优化(PSO)、分布鲁棒机会约束(DRCC)、模型预测控制(MPC)、鲁棒优化、二阶锥规划(SOCP)等先进算法,并提供了基于Matlab/Simulink的完整仿真代码实现,旨在提升新型电力系统的运行灵活性、经济性与抗风险能力。; 适合人群:具备电力系统、自动化、电气工程或相关专业背景,熟悉Matlab/Simulink仿真环境与基本优化算法,从事新能源并网、微电网运行、储能系统规划、电力市场调度等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并构建含储能的电力系统经济调度优化模型;② 掌握机会约束与鲁棒优化在处理新能源不确定性问题中的建模思路与解方法;③ 利用提供的Matlab代码进行算法复现、仿真验证与性能对比,支撑科研项目攻关;④ 为撰写高水平学术论文、学位论文或工程优化方案提供可靠的模型参考与代码支持。; 阅读建议:建议读者结合文档中具体的案例(如风电-水电联合调度、电动汽车集群调度、多微网共享储能等)和配套的Matlab代码进行动手实践,重点关注优化模型的构建逻辑、约束条件设定与解器配置过程,同时可关注公众号“荔枝科研社”获取完整资源包、复现教程及持续的技术支持。

51,407

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧