Monthly Archives: September 2010

[CXF] WSDLs2Java: 从一堆WSDL中一次性生成Java文件

目前CXF的 WSDL2JAVA 一次只能搞一个WSDL, 但一个项目中可能需要搞多个WSDL并打成一个JAR包。 下面的这个类就是帮助你从多个WSDL中生成一团JAVA文件。与ANT结合起来,可以得到更好的效果。


import java.util.ArrayList;
import java.util.Arrays;

import org.apache.cxf.tools.wsdlto.WSDLToJava;

/**
 * Generate Java Codes from a number of WSDL files/urls <br/>
 * 
 * @author chenjianjx
 * 
 */
public class WSDLsToJava {

	/**
	 * 
	 * @param args
	 *            The last args should be like "-wsdlList %wsdl1% %wsdl2% ..." <br/>
	 *            The args between these are just those of CXF
	 */
	public static void main(String[] args) {

		ArrayList<String> argsList = new ArrayList<String>(Arrays.asList(args));

		int argIndexForWsdl = getArgIndexForWsdl(argsList);
		ArrayList<String> preWsdlArgs = getPreWsdlArgs(argsList, argIndexForWsdl);

		for (int i = argIndexForWsdl; i < argsList.size(); i++) {
			String wsdl = argsList.get(i);
			ArrayList<String> cxfArgsList = new ArrayList<String>();
			cxfArgsList.addAll(preWsdlArgs);
			cxfArgsList.add(wsdl);
			WSDLToJava.main(listToArray(cxfArgsList));
		}

	}

	private static String[] listToArray(ArrayList<String> list) {
		String[] array = new String[list.size()];
		list.toArray(array);
		return array;
	}

	private static ArrayList<String> getPreWsdlArgs(ArrayList<String> argsList, int argIndexForWsdl) {
		ArrayList<String> preWsdlArgs = new ArrayList<String>();
		for (int i = 0; i < argIndexForWsdl - 1; i++) {
			String arg = argsList.get(i);
			preWsdlArgs.add(arg);
		}
		return preWsdlArgs;
	}

	private static int getArgIndexForWsdl(ArrayList<String> argsList) {

		for (int i = 0; i < argsList.size(); i++) {
			String arg = argsList.get(i);
			if (arg.trim().equals("-wsdlList")) {
				return i + 1;
			}
		}

		throw new IllegalStateException("No \"-wsdlList\" arg found");
	}

}


如无必要,勿增实体 — 无用接口越多,修改代码的风险越大

每当修改一个接口时,我们都要看看这个接口哪些地方在用,用的地方越多,我们就越要小心,需要回归测试的地方就越多。

所以说,应该尽量不要让接口的能力超过系统所需。比如说,如果现在只需要查询状态为“已付款”的订单,就不要写一个可以查询所有状态的万能接口;再比如,能private的接口就不要写成public。

有时候: 易读的代码不易改,易改的代码不易读

有没有同感?

比如说用了Command、Strategy模式的代码,改起来比较容易,因为解耦比较好,代码重复比较少;

而这些代码读起来却很费劲。 以Strategy模式为例,读者先要找出当前用的是哪个Strategy,回到主程序,然后再去这个Strategy子类里找出真正的处理逻辑。这其中要反复切换当前打开的类文件,并且还要用 Ctrl + T 找到具体的子类,一波三折,很费劲。

代码片段:在数据库COLUMN_NAME和Java类attrName之间互转

// firstName => FIRST_NAME
	private static String attrNameToColumnName(String attName) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < attName.length(); i++) {
			char c = attName.charAt(i);
			if (!(c <= 'z' && c >= 'a')) {
				sb.append("_");
			}
			sb.append(c);
		}
		return sb.toString().toUpperCase();
	}
//FIRST_NAME => firstName 
	private static String columnNameToAttrName(String attrName) {
		String capitalized = WordUtils.capitalize(attrName.toLowerCase(), new char[] { '_' });
		String lineRemoved = StringUtils.remove(capitalized, "_");
		return StringUtils.uncapitalize(lineRemoved);
	}