Restful架构下处理各种操作的解决方法

在一般开发模式用类似于用户解锁,更改密码等操作一般单独开发请求路径。类似于 /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;
	}

 

感觉写的不是很好,但是满足了现有要求。后续看如何继续改进

转载于:https://my.oschina.net/shadowli/blog/1583309

课程简介这是一门使用Java语言,SpringBoot框架,从0开发一个RESTful API应用,接近企业级的项目(我的云音乐),课程包含了基础内容,高级内容,项目封装,项目重构等知识,99%代码为手写;因为这是项目课程;所以不会深入到源码讲解某个知识点,以及原理,但会粗略的讲解下基础原理;主要是讲解如何使用系统功能,流行的第三方框架,第三方服务,完成接近企业级项目,目的是让大家,学到真正的企业级项目开发技术。适用人群刚刚毕业的学生想提高职场竞争力想学从零开发SpringBoot项目想提升SpringBoot项目开发技术想学习SpringBoot项目架构技术想学习企业级项目开发技术就是想学习SpringBoot开发能学到什么从0开发一个类似企业级项目学会能做出市面上90%通用API快速增加1到2年实际开发经验刚毕业学完后能找到满意的工作已经工作学完后最高涨薪30%课程信息全课程目前是82章,155小时,每节视频都经过精心剪辑。在线学习分辨率最高1080P课程知识点1~11章:学习方法,项目架构,编码规范,Postman使用方法,Git和Github版本控制12~16章:搭建开发环境,快速入门SpringBoot框架17~20章:快速入门MySQL数据库21~30章:MyBatis,登录注册,找回密码,发送短信,发送邮件,企业级接口配置31~41章:实现歌单,歌单标签,音乐,列表分页,视频,评论,好友功能42~48章:阿里云OSS,话题,MyBatis-plus,应用监控49~53章:Redis使用,集成Redis,SpringCache,HTTP缓存54~58章:Elasticsearch使用,集成Elasticsearch,使用ES搜索59~61章:商城,集成支付宝SDK,支付宝支付62~64章:常用哈希和加密算法,接口加密和签名65~67章:实时挤掉用户,企业级项目测试环境,企业级接口文档68~69章:SpringBoot全站HTTPS,自签证书,申请免费证书70~73章:云MySQL数据库,云Redis数据库使用,轻量级应用部署环境,域名解析74~80章:Docker使用,生产级Kubernetes集群,域名解析,集群全站HTTPS81~82章:增强和重构项目,课程总结,后续学习计划
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值