利用反射和注解,将java bean装换为bean,提供xml字段排序和别名和别名可以按照一定格式

以前在开发中,采用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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用`@Autowired`注解自动装配时,需要确保以下三个条件满足: 1. Spring容器必须能够扫描到该bean,即该bean必须已经被实例化并注册到Spring容器中。 2. 该bean必须具有默认的构造函数。 3. 该bean必须被标注为`@Component`或其它相关注解。 如果使用XML配置生成的bean,可以使用`<context:component-scan>`元素扫描包路径,将标注为`@Component`或其他相关注解的类自动纳入Spring容器中,如下所示: ```xml <context:component-scan base-package="com.example"/> ``` 如果使用注解生成的bean,需要在配置类上添加`@ComponentScan`注解,指定需要扫描的包路径,如下所示: ```java @Configuration @ComponentScan(basePackages = "com.example") public class AppConfig { // ... } ``` 在使用`@Autowired`注解自动装配时,可以在成员变量、构造函数或方法参数上使用该注解,如下所示: ```java @Service public class MyService { @Autowired private MyDao myDao; public MyService(MyDao myDao) { this.myDao = myDao; } @Autowired public void setMyDao(MyDao myDao) { this.myDao = myDao; } } ``` 需要注意的是,`@Autowired`注解默认情况下是按照类型进行自动装配的,如果存在多个同类型的bean,需要使用`@Qualifier`注解指定具体的bean名称,如下所示: ```java @Service public class MyService { @Autowired @Qualifier("myDaoImpl") private MyDao myDao; } ``` 以上就是使用`@Autowired`注解自动装配XML注解生成的bean的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值