如何设置Spring Boot中@RequestBody反序列化实体的默认值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何设置Spring Boot中@RequestBody反序列化实体的默认值相关的知识,希望对你有一定的参考价值。

可以的
在web程序开发中,前端和服务器数据的传输方式常用的有两种,一种是以表单的形式提交,此时可以利用jquery的serialize()方法将表单内
容转为a=1&b=2&c=3&d=4&e=5这样的格式传输过去,接收端则可以用javabean直接接收。
还有一种方式是以json格式传输,接收时若直接用bean接收则接收不到,此时应该用@RequestBody方式,需要注意的是接收的需要是json串,而不是json对象,可以在发送前使用JSON.stringify函数进行处理。
例子如下
客户端:

var url=path+'testConverter.html';
$.ajax(

url :
url,
type :
"POST",

dataType:"json",

contentType:'application/json;charset=UTF-8',

data:JSON.stringify(userId:'1',userName:'hello',password:'test',credits:'2',lastIp:'',lastVisit:'1986-05-27'),
success :
function(data)

alert(data.userName);

,
error:function(e)

alert("err");



服务端:
@RequestMapping(value="/testConverter.html")

@ResponseBody
public User
testConverter(@RequestBody User user)


System.out.println(user.getUserName());

user.setUserName("testname");

return
user;



上面例子中服务端返回的是个对象,@ResponseBody函数会自动将其转换为客户端要求的‘
dataType:"json",’格式。

最后需要注意的是
1,在xxx-serverlet配置文件中应该写上,以便可以使用
@ResponseBody和@RequestBody

2,发送时要写上 contentType:'application/json'

3,数组内容要用[]而不是list,用list会接收到一个map对象,而不是bean
-
参考技术A Controller方法加参数,参数名和表单中名字一样就可以啊
如:public
String
test(User
user)

System.out.println(user.username);

表单中就是
这样控制台就能打印出表单中输入的username了。
参考技术B Controller方法加参数,参数名和表单中名字一样就可以啊
如:public
String
test(User
user)

System.out.println(user.username);

表单中就是
这样控制台就能打印出表单中输入的username了。
参考技术C Controller方法加参数,参数名和表单中名字一样就可以啊
如:public
String
test(User
user)

System.out.println(user.username);

表单中就是
这样控制台就能打印出表单中输入的username了。
参考技术D 想要将电脑中的Bios设置成光驱引导,这样一开机电脑就会读光驱中的光盘: 步骤是:把电脑的启动设置成【光驱启动】的具体步骤: ①重启电脑,按Del键进入BIOS设置(要快,否则会马上进入操作系统的启动),找到Advanced Bios Features(高级BIOS...

我们如何在 Spring Boot Filter 中获取和设置响应体

【中文标题】我们如何在 Spring Boot Filter 中获取和设置响应体【英文标题】:How can we get and set response body in Spring Boot Filter 【发布时间】:2020-11-09 04:07:29 【问题描述】:

我有一个 Spring MVC 应用程序,它返回 ResponseEntity 和 clientResponse 对象作为响应体

@RestController
public class XxxController 

    public void ResponseEntity(ClientRequest clientRequest) 
         ...
         return ResponseEntity.ok(clientResponse);
    

但是我们如何在 Spring Boot Filter 中获取 clientResponse 对象或者设置一个新的 Response body 呢?

@Component
public class MyClassFilter implements Filter 


    @Override
    public void doFilter( HttpServletRequest req,  HttpServletResponse res, FilterChain chain) throws IOException, ServletException 
 
    

    @Override
    public void destroy() 

    @Override
    public void init(FilterConfig arg0) throws ServletException 


【问题讨论】:

【参考方案1】:

我不确定,但我认为你可以试试这个:

        HttpServletResponse res = (HttpServletResponse) response;
        ContentCachingResponseWrapper ccrw= new ContentCachingResponseWrapper(res);
        //old body:
        String content=new String(ccrw.getContentAsByteArray(), "utf-8");
        //try this 
        HttpServletResponseWrapper hsrw=new HttpServletResponseWrapper(res);
        hsrw.getOutputStream().write(/*new body*/);
        //OR this 
        ServletResponseWrapper responseWrapper = (ServletResponseWrapper)response;
        responseWrapper.getResponse().resetBuffer();
        responseWrapper.getResponse().getOutputStream().write(/*new body*/);
        

【讨论】:

使用上面的ccrw可以做到ccrw.resetBuffer();ccrw.getOutputStream().write(<bytes>);crw.copyBodyToResponse();【参考方案2】:

不确定在过滤器中获取响应是什么意思。在过滤器中,请求尚未传递给控制器​​,因此还没有响应。你可以得到请求。但是请注意不要读取请求,因为在这种情况下,请求流将在过滤器中被读取,并且当它到达控制器时,整个请求流将已经被读取。要设置响应,您可以执行以下操作:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException 
    response.resetBuffer();
    response.setStatus(HttpStatus.OK);
    response.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
    response.getOutputStream().print(new ObjectMapper().writeValueAsString(myData));
    response.flushBuffer(); // marks response as committed -- if we don't do this the request will go through normally!

你可以在这里看到为什么你必须刷新响应。你也可以sendErrorHttpServletResponse#sendError How to change ContentType

如果您不刷新响应,您的请求将沿过滤器链继续(当然,您必须添加 chain.doFilter(request, response);!)。

【讨论】:

There is a response on the way out... "过滤器是一个对象,它对资源请求(servlet 或静态内容)或来自资源,或两者兼而有之。” - docs.oracle.com/javaee/6/api/javax/servlet/Filter.html

以上是关于如何设置Spring Boot中@RequestBody反序列化实体的默认值的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot:如何设置 JDBC 池属性,例如最大连接数?

Spring Boot HttpSecurity - @PreAuthorize - 如何设置 AuthenticationFilter?

如何设置Spring Boot中@RequestBody反序列化实体的默认值

IDEA如何设置spring-boot-devtools即所见即所得

如何根据 Spring Boot 中的活动配置文件设置注释属性值?

如何在Spring Boot中使用Cookies