在一般开发模式用类似于用户解锁,更改密码等操作一般单独开发请求路径。类似于 /user/unlock?*** ,/user/modifyPassword?***
但在如果采用Restful架构这样的请求路径就不太合理,所以想着统一将各种操作封装在类似 /**/action 中
Controller
@RestController
public class WorkOrderController extends BaseController implements Action{
@Resource
private FlowService flowService;
@Resource
private WorkOrderService workOrderService;
/**
* 保存工单
* 2017-08-14 15:27:37
* @param isTemporary 暂存标志
* @return
*/
@RequestMapping(value="/workOrder",method=RequestMethod.POST)
public HttpResponseMessage addWorkOrder(WorkOrder workOrder,Boolean isTemporary){
return null;
}
@Override
@RequestMapping(value="/workOrder/action")
public Object action(String autoId, String action, HttpServletRequest req, HttpServletResponse resp) {
return workOrderService.userAction(autoId,action,req,resp);
}
}
BaseService 业务抽象类
/**
* 业务抽象类
* @author lijie
* @create 2017-06-15
*
*/
public abstract class BaseService {
protected Logger logger = Logger.getLogger(this.getClass());
/**
*
* 用户操作
* <P>通过反射执行方法</p>
* @param auto_id 主键
* @param action 执行动作
* @param req 请求
* @param resp
* @return
*/
public Object userAction(String auto_id, String action, HttpServletRequest req,HttpServletResponse resp) {
Object returnValue = null;
HttpResponseMessage rpm = null;
try {
if (action == null) {
rpm = new HttpResponseMessage();
rpm.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
rpm.setDescribe(ErrorMsg.NONEACTION);
returnValue = rpm;
}
Method[] methods = this.getClass().getMethods();
for (Method method : methods) {
// 名字一样并且有Action的动作注解,没有注解不会执行,可控
if (method.getName().equals(action) && method.getAnnotation(UserAction.class) != null) {
Annotation[][] anotations = method.getParameterAnnotations();
Class<? extends Object>[] clazzs = method.getParameterTypes();// 方法需要的对象
List<Object> parameters = new ArrayList<Object>();
for (int i = 0; i < clazzs.length; i++) {
Class<? extends Object> param = clazzs[i];
Object obj = null;
UserActionParam paramName = (UserActionParam) ObjectUtils.findAnnotation(anotations[i],
UserActionParam.class);
if (paramName != null && paramName.name().equalsIgnoreCase(Constant.IDENTIFY_KEY)) {//auto_id特殊处理
obj = auto_id;
parameters.add(obj);
continue;
} else if (paramName != null) {// 基本類型沒有注解參數会报错
obj = ObjectUtils.dataTypeConvent(param, paramName.name(), req);
} else {
obj = ObjectUtils.setPoperties(param, req,resp);
}
parameters.add(obj);
}
returnValue = method.invoke(this, parameters.toArray());
break;
}
}
if (returnValue == null) {
rpm = new HttpResponseMessage();
rpm.setCode(HttpStatus.NOT_FOUND.value());
rpm.setDescribe(ErrorMsg.NOT_FOUND_ACTION);
returnValue = rpm;
}
} catch (Exception e) {
logger.error(e);
if (rpm == null){
rpm = new HttpResponseMessage();
}
rpm.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
rpm.setDescribe(e.getMessage());
returnValue = rpm;
}
return returnValue;
}
}
Action接口
public interface Action {
/**
* 用户操作
* @param auto_id
* @param action
* @param req
* @return
*/
Object action(String autoId,String action,HttpServletRequest req,HttpServletResponse resp);
}
这样各种操作可以如下调用
重置密码:/user/action?action=resetPassword&auto_id=000000001
解锁用户:/user/action?action=unLock&auto_id=000000001
/**
* 重置密码
* @param auto_id 用户ID
* @return
*/
@UserAction
public HttpResponseMessage resetPassword(@UserActionParam(name=Constant.IDENTIFY_KEY) String auto_id) {
HttpResponseMessage rpm = new HttpResponseMessage();
try {
String password = desEncrypt.getDefaultPassword();
userDao.resetPassword(auto_id, password);
rpm.setCode(HttpStatus.OK.value());
rpm.setDescribe(Constant.PASSWORD_RESET_OK);
} catch (Exception e) {
rpm.setCode(HttpStatus.OK.value());
rpm.setDescribe(Constant.PASSWORD_RESETED_FAIL + e);
}
return rpm;
}
感觉写的不是很好,但是满足了现有要求。后续看如何继续改进