Browse Source

action 参数注入 Model 支持 json 请求解析

James 4 years ago
parent
commit
06b97a06a8
1 changed files with 31 additions and 1 deletions
  1. 31 1
      src/main/java/com/jfinal/core/paragetter/ModelGetter.java

+ 31 - 1
src/main/java/com/jfinal/core/paragetter/ModelGetter.java

@@ -15,20 +15,50 @@
  */
 package com.jfinal.core.paragetter;
 
+import javax.servlet.http.HttpServletRequest;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.jfinal.core.Action;
 import com.jfinal.core.Controller;
+import com.jfinal.kit.ReflectKit;
+import com.jfinal.plugin.activerecord.Model;
 
+/**
+ * 注意: json 请求需要注意 json 中的字段名与数据库字段名一致,
+ */
 public class ModelGetter<T> extends ParaGetter<T> {
 
 	private final Class<T> modelClass;
+	
 	public ModelGetter(Class<T> modelClass, String parameterName) {
 		super(parameterName,null);
 		this.modelClass = modelClass;
 	}
+	
 	@Override
+	@SuppressWarnings({ "rawtypes", "unchecked" })
 	public T get(Action action, Controller c) {
-		return c.getModel(modelClass, this.getParameterName(),true);
+		String paraName = this.getParameterName();
+		if (ParaProcessor.resolveJson && c.isJsonRequest()) {
+			JSONObject attrs;
+			HttpServletRequest req = c.getRequest();
+			if (req.getParameterMap().containsKey(paraName)) {
+				// 存在与 action 形参名相同的 request 参数则使用其 value 值进行转换
+				// attrs = JSON.parseObject(req.getParameter(paraName), HashMap.class);
+				attrs = JSON.parseObject(req.getParameter(paraName));
+			} else {
+				// 否则使用整个请求中的 json 进行转换
+				// attrs = JSON.parseObject(c.getRawData(), HashMap.class);
+				attrs = JSON.parseObject(c.getRawData());
+			}
+			
+			Model ret = (Model) ReflectKit.newInstance(modelClass);
+			return (T)ret._setOrPut(attrs);
+		} else {
+			return c.getModel(modelClass, paraName, true);
+		}
 	}
+	
 	@Override
 	protected T to(String v) {
 		return null;