本日我们说说参数校验和国际化,软件开发,这些代码没有什么技能含量,却大量充斥在业务代码上,很大概业务代码只有几行,参数校验代码却有十几行,很是影响代码阅读,所以很有须要把这块的代码量减下去。
本日的目标主要是把之前例子内里的和业务无关的国际化参数埋没掉,以及如何封装好校验函数。
本日累,少措辞多贴代码,先看比拟图,修改前:
service
修改后:
services
Controll的非业务代码如何去掉参考我的编码习惯 – Controller类型,下面说说去掉Local参数。
强调一下:业务代码内里不要呈现和业务无关的对象,软件开发,如local,MessageSource 。
去掉国际化参数照旧利用的技能照旧ThreadLocal。国际化信息可以放好几个处所,但发起不要放在每一个url上,除了较量low还容易出许多其他问题。这里演示的是放在cookie上面的例子:
UserUtil
public class UserUtil { private final static ThreadLocal<String> tlUser = new ThreadLocal<String>(); private final static ThreadLocal<Locale> tlLocale = new ThreadLocal<Locale>() { protected Locale initialValue() { // 语言的默认值 return Locale.CHINESE; }; }; public static final String KEY_LANG = "lang"; public static final String KEY_USER = "user"; public static void setUser(String userid) { tlUser.set(userid); // 把用户信息放到log4j MDC.put(KEY_USER, userid); } public static String getUser() { return tlUser.get(); } public static void setLocale(String locale) { setLocale(new Locale(locale)); } public static void setLocale(Locale locale) { tlLocale.set(locale); } public static Locale getLocale() { return tlLocale.get(); } public static void clearAllUserInfo() { tlUser.remove(); tlLocale.remove(); MDC.remove(KEY_USER); } }
CheckUtil,这里需要获得用户的语言
package plm.common.utils; import org.springframework.context.MessageSource; import plm.common.exceptions.CheckException; public class CheckUtil { private static MessageSource resources; public static void setResources(MessageSource resources) { CheckUtil.resources = resources; } public static void check(boolean condition, String msgKey, Object... args) { if (!condition) { fail(msgKey, args); } } public static void notEmpty(String str, String msgKey, Object... args) { if (str == null || str.isEmpty()) { fail(msgKey, args); } } public static void notNull(Object obj, String msgKey, Object... args) { if (obj == null) { fail(msgKey, args); } } private static void fail(String msgKey, Object... args) { throw new CheckException(resources.getMessage(msgKey, args, UserUtil.getLocale())); } }
这里有几个小技能点:
东西类内里利用spring的bean,利用了MethodInvokingFactoryBean的静态要领注入:
<!-- 国际化 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>format</value> <value>exceptions</value> <value>windows</value> </list> </property> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="plm.common.utils.CheckUtil.setResources" /> <!-- 这里设置参数 --> <property name="arguments" ref="messageSource"> </property> </bean>
server内里挪用的利用没有呈现类名
这里利用的jdk的import static 特性,可以在ide上设置,请自行google。
import static plm.common.utils.CheckUtil.*;