如果遇到了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: 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 @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
註解修飾的,所以生成了單參建構函式。