以前在开发中,采用json为传输,但是字段比较多,每次的请求的字段都会错位,非常麻烦,就利用fastJson的JSONField注解功能,这样,每次请求的参数顺序就一致,
最近在写接口的时候 ,发现xml 没有这样的功能,所以写一个,供大家分享,本代码需要在jdk1.7上运行,具体为什么自己看去,如果想不出来,就别想了(ps:我怎么会告诉的)。
需要的jar 就是dom4j 1.6.1
借此机会利用下注解的使用方式,以前只是了解,没有使用过。
这个转换bean到xml的主体代码
public class Dom4jBeanToXml {
public static <T> String beanToXml( T object) {
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement(object.getClass().getSimpleName());
Dom4jBeanToXml dom4jBeanToXml = new Dom4jBeanToXml();
try {
dom4jBeanToXml.generateElement(object.getClass(), object, root);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(doc.asXML());
return "";
}
private void generateElement(Class<? extends Object> class1, Object invoke2, Element root) throws Exception {
Field[] fields = class1.getDeclaredFields();
Map<Integer, Field> sortMap = new TreeMap<Integer, Field>(new MapKeyComparator());
int index = 1000;
for (Field field : fields) {
XMLField annotation = field.getAnnotation(XMLField.class);
int ordinal = 0;
if (annotation != null) {
ordinal = annotation.ordinal();
}
if (ordinal == 0) {
ordinal = index++;
}
//防止设置顺序重复
if(sortMap.get(ordinal) != null){
ordinal = (int) (ordinal+10000*Math.random());
System.out.println("排序重复来"+ordinal);
}
sortMap.put(ordinal, field);
}
for (Integer key : sortMap.keySet()) {
Field field = sortMap.get(key);
XMLField annotation = field.getAnnotation(XMLField.class);
String name = "";
if (annotation != null) {
if(!annotation.name().equals("")){//如果别名存在使用别名
name = annotation.name();
}else{
name = formatCase(field, annotation);
}
} else {
name = field.getName();
}
Method method = class1
.getMethod("get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1));
Element addElement = root.addElement(name);
if (annotation != null && annotation.hasNextLevel()) {
method.setAccessible(true);
Object invoke = method.invoke(invoke2);
generateElement(invoke.getClass(), invoke, addElement);
} else {
addElement.setText(method.invoke(invoke2).toString());
}
}
}
private String formatCase(Field field, XMLField annotation) {
String name = field.getName();
String format = annotation.format();
switch (format) {
case "upper":
name = name.toUpperCase();
break;
case "lower":
name = name.toLowerCase();
break;
}
return name;
}
这个是注解,注解规则
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface XMLField {
int ordinal() default 0;//排序
String name() default "";//别名
boolean hasNextLevel() default false;
//upper:大写 lower:小写 default:默认 hump:驼峰
String format() default "default";
}
使用的方式将bean中参数 设置成如下:
@XMLField(hasNextLevel=true,ordinal=1)
private Common common;
调用一小下就可以
Dom4jBeanToXml.beanToXml(frxbfj);