由于项目里有很多json形式的参数,jfinal形参注入并不支持json请求体。想扩展下,发现不修改源代码怎么写都很丑。所以修改了一些源代码
//Para注解增加 自定义paraGetter
public @interface Para {
/**
* 不能使用空字符串:
* 1: 对于 value() 早已用于无 modelName 前缀的场景:action(@Para("")User user)
* 2: 对于 defaultValue() 可用于指定默认值为空字符串:action(@Para(defaultValue = "")String email)
*/
String NULL_VALUE = "-NULL VALUE-";
/**
* 对应到 HTTP 参数里的参数名称
*/
String value() default NULL_VALUE;
/**
* 默认值
*/
String defaultValue() default NULL_VALUE;
/**
* 可以自定义 paraGetter
*/
Class<? extends CustomParaGetter> paraGetter() default CustomParaGetter.NullGetter.class;
}//修改 ParaProcessorBuilder.createParaGetter方法
if (para != null) {
// 支持 @Para 注解仅指定 defaultValue 值的用法
if (!Para.NULL_VALUE.equals(para.value())) {
parameterName = para.value().trim();
}
/*
defaultValue = para.defaultValue().trim();
if (defaultValue.isEmpty()) {
defaultValue = null;
}*/
// 空字符串 "" 可以成为默认值,空白字符串与前后有空白字符的文本也可以成为默认值: " "、" ABC "
if (!Para.NULL_VALUE.equals(para.defaultValue())) {
defaultValue = para.defaultValue();
}
//这一段是我新增的
Class<? extends ParaGetter> paraGetter = para.paraGetter();
if (paraGetter != CustomParaGetter.NullGetter.class) {
try {
Constructor<? extends ParaGetter> constructor = paraGetter.getConstructor(Class.class, String.class, String.class);
return constructor.newInstance(typeClass, parameterName, defaultValue);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}//如果要自定义 ParaGetter 继承这个类
public abstract class CustomParaGetter<T> extends ParaGetter<T> {
private final Class<T> type;
public CustomParaGetter(Class<T> type, String parameterName, String defaultValue) {
super(parameterName, defaultValue);
this.type = type;
}
protected Class<T> getType() {
return type;
}
public static class NullGetter extends CustomParaGetter {
public NullGetter(Class type, String parameterName, String defaultValue) {
super(type, parameterName, defaultValue);
}
@Override
protected Object to(String v) {
return null;
}
@Override
public Object get(Action action, Controller c) {
return null;
}
}
}如果要自定义 ParaGetter ,需要继承 CustomParaGetter添加自己的实现
//json
public class JsonParaGetter extends CustomParaGetter {
public JsonParaGetter(Class type, String parameterName, String defaultValue) {
super(type, parameterName, defaultValue);
}
@Override
protected Object to(String v) {
return null;
}
@Override
public Object get(Action action, Controller c) {
return JsonKit.parse(c.getRawData(), this.getType());
}
}最后形参注入时指定 ParaGetter即可
public void index(@Para(paraGetter = JsonParaGetter.class) TestJsonBean user) {
System.out.println(user);
renderNull();
}可以愉快的自定义 ParaGetter 了