Spring Mvc Http 400 Bad Request问题排查

如果遇到了Spring MVC报错400,而且没有返回任何信息的情况下该如何排查问题?

问题描述

一直都没毛病的接口,今天测试的时候突然报错400 Bad Request,而且Response没有返回任何信息。

解决方案

尝试了一下午,终于找到了排查这类问题的办法。

我们知道,在Spring MVC里面,
org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
负责所有异常的统一处理。我们只要在方法handleException打上断点即可。

点开发现,原来是Lombok的问题。报错如下

Could not read JSON document: Can not construct instance of xxx: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: [email protected]; line: 2, column: 5]

Lombok没有为我们自动生成类的构造函数。我们在目标类加上@NoArgsConstructor即可解决。

刨根问底

为什么Lombok自动生成的类,没有可供Jackson反序列化的构造函数呢?我看了一下生成的字节码文件,里面确实不存在无参构造和全参构造函数,唯一的构造函数是带一个参数的。

目标类使用了@Data注解,而@Data注解的声明如下

/**
 * Generates getters for all fields, a useful toString method, and hashCode and equals implementations that check
 * all non-transient fields. Will also generate setters for all non-final fields, as well as a constructor.
 * <p>
 * Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.
 * <p>
 * Complete documentation is found at <a href="https://projectlombok.org/features/Data">the project lombok features page for @Data</a>.
 *
 * @see Getter
 * @see Setter
 * @see RequiredArgsConstructor
 * @see ToString
 * @see EqualsAndHashCode
 * @see lombok.Value
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
    String staticConstructor() default "";
}

简单来说,@Data包含了以下注解的功能

  • @Getter
  • @Setter
  • @RequiredArgsConstructor
  • @ToString
  • @EqualsAndHashCode

而“罪魁祸首”就是@RequiredArgsConstructor了,它的作用是

为每个需要特殊处理的字段(final修饰的或者是@NotNull注释的字段)生成一个带有1个参数的构造函数。

而目标类恰巧有一个字段就是@NotNull注解修饰的,所以生成了单参构造函数。

参考

原文地址:https://www.cnblogs.com/gcdd/p/12292319.html

时间: 2024-11-18 22:51:44

Spring Mvc Http 400 Bad Request问题排查的相关文章

spring mvc controller中获取request head内容

spring mvc controller中获取request head内容: @RequestMapping("/{mlid}/{ptn}/{name}") public String print(@PathVariable Integer mlid, @PathVariable String ptn, @PathVariable String name, HttpSession session, Model model, @RequestHeader String referer,

spring mvc 数据绑定 400错误

情景:使用在方法中绑定数据的时候,打开链接,出现400错误. @RequestMapping(value = "editItemSubmit") public String editItemSubmit(int id, Items item) { itemService.updateItemFromId(id, item); return "redirect:queryItemlList"; } public class Items { private int id

spring mvc ajax 400解决

The request sent by the client was syntactically incorrect. ajax发起请求时报400错误.请求代码如下: var reportId=($(obj).parent().parent().parent().children(":first").attr("value")); var isChecked=$(obj).prop("checked")=="checked"?

spring mvc文件上传,request对象转换异常

spring 文件上传有现成的工具用起来也挺简单.就是在还不是非常熟悉的时候可能会出一些错. 近期碰到了 org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest 这个异常,非常多人说enctype="multipart/form-data"这个属性没设置,可是我已经设置了.有说让在配置文件里加入

Spring MVC,HTTP Status 400 ,jQuery

一.先看下4xx错误的说明 [转载] http status 400,http 400,400 错误 [参考] status code 400, Bad Request (§10.4.1) 4 请求失败4xx 4xx应答定义了特定服务器响应的请求失败的情况.客户端不应当在不更改请求的情况下重新尝试同一个请求.(例如,增加合适的认证信息).不过,同一个请求交给不同服务器也许就会成功. 4.1 400 Bad Request 请求中的语法错误.Reason-Phrase应当标志这个详细的语法错误,比

spring MVC 中获取request

spring MVC中如何获取request 呢? 有如下方式: 方式一:在action中注入request 直接在action的参数中增加HttpServletRequest request 例如 /*** * 返回json * @param id * @param roleLevel * @param model * @param request * @param targetView * @return * @throws SecurityException * @throws NoSuc

Spring MVC(一)

The figure below shows the flow of request in the Spring MVC Framework. When a request is sent to the Spring MVC Framework the following sequence of events happen. The DispatcherServlet first receives the request. The DispatcherServlet consults the H

A real ROCA using Bootstrap, jQuery, Thymeleaf, Spring HATEOAS and Spring MVC

http://www.tuicool.com/articles/ENfe2u https://github.com/tobiasflohre/movie-database What is the best way to build a web application? I know, tough question, and in the end, there cannot be one definitive answer, because otherwise there wouldn’t exi

Spring MVC 学习笔记-----data binding

Servlet中的输入参数为都是string类型,而spring mvc通过data bind机制将这些string 类型的输入参数转换为相应的command object(根据view和controller之间传输数据的具体逻辑,也可称为model attributes, domain model objects).在这个转换过程中,spring实际是先利用java.beans.PropertyEditor中的 setAdText方法来把string格式的输入转换为bean属性, 亦可通过继承