@ResponseBody
@RequestMapping(value = "order/pickupinfo", method = RequestMethod.POST, produces = {
"application/json;charset=UTF-8" })
public ResReslt orderList(String req, HttpServletResponse response) {
saveLog(。。。)//保存日志方法
return tt;
}
如果使用上面的方面编写编写输出日志的话,每个方法中都需要写saveLog(。。。),这样搞维护起来比较麻烦,也有可能会有遗漏的地方没有输出日志。
下面我们通过实现import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
这个接口的方式输出日志:
package com.cloud.tools.aop;
import org.slf4j.Logger;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.cloud.api.pojo.ResPageReslt;
import com.cloud.api.pojo.ResReslt;
import com.cloud.api.util.ObjToJson;
import com.cloud.log.ReqAndResLog;
@ControllerAdvice
public class ResponseBodyAdviceImp implements ResponseBodyAdvice{
Logger jsonLog = org.slf4j.LoggerFactory.getLogger(ResponseBodyAdviceImp.class);
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if(null !=body){
String flag = body.toString();
ReqAndResLog reqAndResLog = new ReqAndResLog();
ReqAndResLog temp = reqAndResLog.getInfo();
if(temp !=null){
//已经存在日志对象时,进行比较
if(flag.toString().equals(temp.getRes())){
//移除日志对象
reqAndResLog.remove();
StringBuffer res = new StringBuffer(60);
res.append(returnType.getMethod().getName()).append(";");
if(body instanceof ResReslt){
res.append(ObjToJson.ResResltToStr((ResReslt)body));
}else if(body instanceof ResPageReslt){
res.append(ObjToJson.ResPageResltToStr((ResPageReslt)body));
}
jsonLog.debug(res.toString());
}
}else{
//不存在日志对象,加入
reqAndResLog.setRes(flag);
reqAndResLog.setInfo(reqAndResLog);
}
}
return body;
}
}
package com.cloud.log;
public class ReqAndResLog {
public static final ThreadLocal<ReqAndResLog> REQ_AND_RES_LOG = new ThreadLocal<ReqAndResLog>();
//请求参数
private String req;
private String res;
public String getRes() {
return res;
}
public void setRes(String res) {
this.res = res;
}
public String getReq() {
return req;
}
public void setReq(String req) {
this.req = req;
}
public void setInfo(ReqAndResLog reqAndResLog){
REQ_AND_RES_LOG.set(reqAndResLog);
}
public ReqAndResLog getInfo(){
return REQ_AND_RES_LOG.get();
}
public void remove(){
REQ_AND_RES_LOG.remove();
}
}
ReqAndResLog:作用是防止同样的日志输出两边;
2.配置文件
<bean id="ResponseBodyAdviceImp" class="com.cloud.tools.aop.ResponseBodyAdviceImp" />
相关推荐
在开发Web应用时,我们经常会遇到一个问题:当使用Spring MVC的`@ResponseBody`注解将后端处理结果直接转化为HTTP响应体时,如果这个结果中包含HTML特殊字符,如尖角号、引号、按位与符号等,浏览器可能会误解析,...
"@ResponseBody 默认输出的误区的解答" @ResponseBody 是 Spring 框架中的一个注解,用于标注 Controller 中的方法,表示该方法的返回值将被写入到 HTTP 响应体中。但是,关于@ResponseBody 默认输出的误区一直存在...
-- @ResponseBody() spring-mvc 3 xml 配置--> <!--处理 @ResponseBody 中文乱码问题 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> ...
下面我们将深入探讨`@ResponseBody`的使用、工作原理以及相关的配置和最佳实践。 1. **基本使用** `@ResponseBody`可以放在方法上,表示该方法的返回值将不经过视图解析,而是直接写入HTTP响应体。例如,我们有一...
@ResponseBody 和 @RequestBody 注解的区别 在 Spring 框架中,@ResponseBody 和 @RequestBody 是两个常用的注解,它们都用于处理 HTTP 请求和响应,但是它们的作用和使用场景却有所不同。 一、@ResponseBody 注解...
例如,如果你的控制器方法返回一个Java对象,添加`@ResponseBody`后,Spring会使用内置的HttpMessageConverter将对象转换为JSON字符串,使得前端可以解析。这对于RESTful API的开发尤其重要,因为它允许我们以数据...
标题中的“Spring MVC – Easy REST-Based JSON Services with @ResponseBody”是指使用Spring MVC框架构建基于REST的JSON服务,并通过使用`@ResponseBody`注解来简化这一过程。REST(Representational State ...
标题提到的"最新版本 Jackson 2.8.2 jar与Spring 4.x @ResponseBody配合使用"涉及到的关键知识点包括Jackson的三个核心模块,以及如何在Spring MVC中利用这些模块实现RESTful API的数据响应。 1. **Jackson核心模块...
`@ResponseBody` 注解则用在方法返回值前,表明方法的返回结果应该直接写入到HTTP响应体中,而不是作为视图进行渲染。Spring MVC同样会使用`HttpMessageConverter`将返回的对象转换为合适的格式,如JSON或XML,然后...
在Spring MVC框架中,`@RequestBody` 和 `@ResponseBody` 是两个非常重要的注解,它们在处理HTTP请求和响应时起到了关键作用。本篇文章将详细解释这两个注解的工作原理、使用场景以及如何实现Java对象与XML/JSON数据...
在Spring MVC 4.x版本中,开发者可以使用@ResponseBody注解来简化控制器层向客户端返回JSON格式数据的过程。 ### @ResponseBody注解使用方法 @ResponseBody注解可以作用于方法上,它会指示Spring MVC框架将该方法...
在标签中提到的"jar",指的是Java Archive,是Java平台的标准归档格式,用于收集多个文件并将其打包成单个文件,便于分发和部署。在这个场景下,`JSON.rar`可能包含了处理JSON转换所需的库,比如Jackson的JAR文件。...
CustomerRequestBodyAdvisor将负责打印请求参数日志,而CustomerResponseBodyAdvisor将负责打印响应结果日志。 ```java // CustomerRequestBodyAdvisor.java /* 打印请求参数日志*/ public class ...
本文将详细介绍如何解决SpringMVC中`@ResponseBody`注解返回中文乱码的问题。 首先,我们可以尝试使用`@RequestMapping`注解的`produces`属性来指定响应内容的MIME类型和字符集。例如: ```java @RequestMapping...
springmvc+国际化i18N+springmvc验证+jetbrick-template使用+@responsebody+谷歌guava: 1)围绕springmvc做的国际化 2)围绕springmvc做的验证 3)使用的jetbrick-template模板引擎 ……
1)spring MVC 中@ResponseBody需要的所有JAR包 2)性能还不错的模板引擎jetbrick-template-2.x 2.x的所需的所有jar包 3)日志jar包:slf4j和logback 所有 4)阿里 druid 连接池jar包 5)mysql数据库链接驱动jar包 6...
spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法 在使用 Spring+Mybatis 框架时,经常会遇到一个问题,就是通过 @ResponseBody 返回结果时,中文字符会出现乱码的问题。这是因为在 Spring MVC 中,...
在Spring Boot应用中,当你使用`@ResponseBody`注解将对象转换为JSON并发送到客户端时,日期(Date)类型的字段通常需要特殊处理,因为它们默认可能会被转换为Unix时间戳或者不友好的格式。本篇文章主要介绍了两种...
Spring MVC注解之@ResponseBody和@RequestBody详解 在Spring MVC框架中,@ResponseBody和@RequestBody是两个非常重要的注解,它们分别用于处理HTTP请求响应体和请求体的序列化和反序列化。下面,我们将详细介绍这两...