今天在业务中遇到这样子的一个问题,然后就想考研分享一下。在生成xml的时候,如果xml对象的属性为null时,则最后的xml形式是为000010
其中的属性会被隐藏,但是我们要显示的时候,就可以将其null改变为” “形式的空字符串。
在这里我是用的设置监听的方式,并不需要去改原始的pojo类或者加什么注解之类,我觉得那样子反而要改动很多的东西,具体代码如下:
我是采用的内部类的方式, class MarshallerListener extends Marshaller.Listener{
public static final String BLANK_CHAR = "";
@Override
public void beforeMarshal(Object source) {
super.beforeMarshal(source);
Field[] fields = source.getClass().getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
try {
if (f.getType() == String.class && f.get(source) == null) {
f.set(source, BLANK_CHAR);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
之后在业务方法中,UserRootXml urx = dao.findUserById(id),其中的UserRootXml就是我们的基础类,用来产生xml节点的那个基础表,之后我们可以对这个urx对象进行一些操作,比如赋值,加数据等等根据自己的业务需求。然后我们在此写一个方法来用于生成xml文件,
“`
static void userconvertToXml(Object obj, String path){
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
CPICService.MarshallerListener marlistener=new CPICService().new MarshallerListener();
marshaller.setListener(marlistener);
FileWriter fw = null;
try {
fw = new FileWriter(path);
} catch (IOException e) {
e.printStackTrace();
}
marshaller.marshal(obj, fw);
} catch (JAXBException e) {
e.printStackTrace();
}
}
“`依然采用的是内部类的调用方式,其中 marshaller.setListener(marlistener);就是在对我们要运行的生成xml那个静态方法进行设置监听,,可以类似于理解成为spring的监听机制。之后,再去运行生成xml就可以将数据库传过来的null变为” “空字符串进行输出了。
哦对了,还有一个问题,,忽然想到的题外话,,就是关于spring自带的junit测试方面的,,如果出现运行测试没有任何结果,,就不是红色也不是绿色的那种,,有可能就是dao里面的xml的问题,因为今天遇到的,如果有相同的id(即相同的方法名),那当运行测试时候,就会一直在等待的过程,真的很痛苦。