Spring Mvc Http 400 Bad Request問題排查

ITLearner發表於2020-02-10

如果遇到了Spring MVC報錯400,而且沒有返回任何資訊的情況下該如何排查問題?

問題描述

一直都沒毛病的介面,今天測試的時候突然報錯400 Bad Request,而且Response沒有返回任何資訊。

Spring Mvc Http 400 Bad Request問題排查

Spring Mvc Http 400 Bad Request問題排查

解決方案

嘗試了一下午,終於找到了排查這類問題的辦法。

我們知道,在Spring MVC裡面, org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler 負責所有異常的統一處理。我們只要在方法handleException打上斷點即可。

Spring Mvc Http 400 Bad Request問題排查

點開發現,原來是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: java.io.PushbackInputStream@12544acd; 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 &#64;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註解修飾的,所以生成了單參建構函式。

參考

相關文章