Springmvc遇到的问题和解决方案(仅供自己参考,不喜勿喷)

       1. 当后台传递的json格式里面嵌套多层的时候,类似于后台传的Result<PageResult<RetireInfor>>,你就需要多次的进行转换:
HttpSession session = request.getSession();
			String token = (String) session.getAttribute(Constants.TOKEN);

			// 发送服务端进行校验
			responseData = retireInforService.getRetireInforsByStatus(token, status, start, pageSize);

			// JSONObject先转换成json字符串
			String respnJSON = JSON.toJSONString(responseData);

			// 转换成结果对象
			// Result<PageResult<RetireInfor>> pageResult =
			// (Result<PageResult<RetireInfor>>) JSON.parseObject(respnJSON,
			// new TypeReference<Result<PageResult<RetireInfor>>>() {
			// });
			Result<JSONObject> allResult = (Result<JSONObject>) JSON.parseObject(respnJSON,
					new TypeReference<Result<JSONObject>>() {
					});
			pageResult = (PageResult<RetireInfor>) JSON.parseObject(allResult.getContent().toString(),
					new TypeReference<PageResult<RetireInfor>>() {
					});

     PageResult<RetireInfor>的格式是这样的:

package com.rmsClient.entity.po;

import java.util.List;

public class PageResult<T> {

	private Integer code;
	private String message;
	private Integer totalNum;// 总记录数
	private Integer totalPage;// 总页数

	private List<T> resultList;

	public Integer getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(Integer totalPage) {
		this.totalPage = totalPage;
	}

	public Integer getTotalNum() {
		return totalNum;
	}

	public void setTotalNum(Integer totalNum) {
		this.totalNum = totalNum;
	}

	public List<T> getResultList() {
		return resultList;
	}

	public void setResultList(List<T> resultList) {
		this.resultList = resultList;
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}



     还有另外一种情况2017年3月2日18:34:38:

        当后台传递的对象里面还有一层List<对象>时,类似于:Result<List<WageItemInfor>>,这种时候就需要先将它转换成Result<JSONArray>,然后将里面的List使用json转换成数组,如下:

public List<WageItemInfor> getWageItemInfors(HttpServletRequest request) {
		JSONObject responseData = new JSONObject();

		List<WageItemInfor> list = null;
		try {

			HttpSession session = request.getSession();
			String token = (String) session.getAttribute(Constants.TOKEN);

			// 发送服务端进行校验
			responseData = wageStandardService.getWageItemInfors(token);

			// JSONObject先转换成json字符串
			String respnJSON = JSON.toJSONString(responseData);

			Result<JSONArray> allResult = (Result<JSONArray>) JSON.parseObject(respnJSON,
					new TypeReference<Result<JSONArray>>() {
					});//JSONArray这里要注意list就用这个,如果是对象,就用JSONObject,否则会报错

			// 将json转换成list数组
			list = JSONObject.parseArray(JSON.toJSONString(allResult.getContent()), WageItemInfor.class);

		} catch (Exception e) {
			LogUtil.error(e);
		}
		return list;
	}
         后台返回的对象格式类似于这样:

        

package com.springMVC.entity;

import com.alibaba.fastjson.JSON;
import com.springMVC.util.ExceptionCode;
import com.wordnik.swagger.annotations.ApiModel;
import com.wordnik.swagger.annotations.ApiModelProperty;

@ApiModel(description = "结果集")
public class Result<T> {

	@ApiModelProperty(value = "返回码")
	private Integer code;
	@ApiModelProperty(value = "返回信息")
	private String message;
	@ApiModelProperty(value = "返回值")
	private T content;

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public T getContent() {
		return content;
	}

	public void setContent(T content) {
		this.content = content;
	}

	public void setCodeAndMessage(ExceptionCode eCode) {
		this.code = eCode.getCode();
		this.message = eCode.getMessage();
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("{\n");
		sb.append(" code: ").append(code).append("\n");
		sb.append(" message: ").append(message).append("\n");
		sb.append(" content: ").append(JSON.toJSONString(content)).append("\n");
		sb.append("}");
		return sb.toString();
	}
}



     2.当点击登出时候,需要将浏览器上方的地址进行重定向到登陆界面,需要在modelandview里面添加重定向的关键字redirect,如果在拦截器里面需要跳转到登陆界面可以使用:response.sendRedirect(request.getContextPath() + "/login");,需要加上绝对路径:

	// 登出
	@RequestMapping(value = "/user/logout", method = RequestMethod.POST)
	@ResponseBody
	@SystemLog(apiPath = "/user/logout")
	@ApiOperation(value = "登出", httpMethod = "POST", notes = "登出")
	public ModelAndView logout(HttpServletRequest request) {
		ModelAndView mav = new ModelAndView();

		JSONObject responseData = new JSONObject();
		ResultSimple loginResult = new ResultSimple();
		try {

			// 获取Session,判断是否能拿到token,如果没有的话,就需要跳转到主界面
			HttpSession session = request.getSession();
			String token = (String) session.getAttribute(Constants.TOKEN);

			// 发送服务端进行校验
			responseData = userService.logout(token);

			// JSONObject先转换成json字符串
			String respnJSON = JSON.toJSONString(responseData);

			// 转换成结果对象
			loginResult = (ResultSimple) JSON.parseObject(respnJSON, ResultSimple.class);

			// 如果登出成功,则删除掉session里面的token
			if (loginResult.getCode() == Constants.SUCCESSCODE) {// code为0代表成功
				session.removeAttribute(Constants.TOKEN);
				mav.setViewName("redirect:/login");
			}

			mav.addObject("logout", loginResult);

		} catch (Exception e) {
			LogUtil.error(e);
		}
		return mav;
	}

    3.服务端的api分为后台的服务端和提供给前端的api接口,当发送一个get请求给后台时,参数里面有或者中文乱码的问题、空格或者\t等,就会报505的错误,所以需要将字符串中的这些字符都过滤掉,参考如下博客http://blog.csdn.net/qq_24531461/article/details/52934092:

                

public static String replaceBlank(String str) {  
    String dest = "";  
    if (str != null) {  
        Pattern p = Pattern.compile("\\s*|\t|\r|\n");  
        Matcher m = p.matcher(str);  
        dest = m.replaceAll("");  
    }  
    return dest;  
}  

          还有就是参数的中文乱码问题,也需要处理和考虑


   4.从前台传给我的查询条件,是一个json对象,后台有一个对应的实体类,使用fastjson转换的时候遇到错误WageQueryCriteria criteria = JSONObject.parseObject(wageQueryCriteria, WageQueryCriteria.class);:如果WageQueryCriteria 里面有属性是list类型的就会报错:fastjson exepct '[', but string, type : class,原因应该是list属性的问题,解决方法是:

可以让前台将list转成json格式的。

   5.当你使用http的put/get发送请求给服务端的时候,有时候要注意的是将参数拼接,需要转换成object形式,如果是字符串会有报错,比如后台需要date类型,就会报400或者505的错误,需要变成object类型。  当使用get请求,url参数进行拼接的时候,如果参数为null,就会导致报错,需要进行判断,然后置为:“”,这样就不会报错了,如下:

// 这里注意是否无误需要判断是否为null的情况,需要转换为""才会不报错
			Object corrString = null;
			if (correct == null) {
				corrString = "";
			} else {
				corrString = correct;
			}
			// get请求,将参数和访问接口进行拼接
			String getURL = Method.RETIREINFOR_GETRETIREINFORBYSTATUS + "?status=" + status + "&page=" + page
					+ "&correct=" + corrString + "&pageSize=" + pageSize + "&token=" + token;
			responseData = super.sendHttpGET(getURL);


   4.遇到一个很奇葩的问题是同事的电脑,获取的date是有GMT格式的,而我几个同事是cst格式的,,这样导致后台获取时间有误,需要手动增加一行代码使时区都为cst格式,如下:

 TimeZone.setDefault(TimeZone.getTimeZone("CST"));       //非常关键的!!!  

   5.后台服务端使用post请求的时候,发现后端取到的为乱码,需要在outputstream重新设置编码:
OutputStream outputStream = null;
		OutputStreamWriter outputStreamWriter = null;
		InputStream inputStream = null;
		InputStreamReader inputStreamReader = null;
		BufferedReader reader = null;
		StringBuffer resultBuffer = new StringBuffer();
		String tempLine = null;

		try {
			outputStream = httpURLConnection.getOutputStream();
			outputStreamWriter = new OutputStreamWriter(outputStream,charset);


     6.springmvc做账号重复登录的权限控制时候,本来想些一个拦截器来拦截,如果token失效(token保存在数据库中),就使用重定向指向登录界面,但发现如果前端是通过ajax方式请求的话,是无法修改浏览器的url地址的,所以不用拦截器,只在每次访问后台接口,验证token是否失效,返回错误码,让前端来调回到登陆界面。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值