HttpMessageNotWritableExceptionが発生すると500エラーになり、なかなか厄介な例外です。
2021-02-21 09:23:17.661 WARN 11200 --- [nio-8081-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class com.springhack.happylibrary.controller.sample.response.ResponseDto]
発生原因 レスポンスDTOにgetterが存在しない
この例外が発生したときの私のコードはこうなっていました。
@CrossOrigin
@RestController
@RequestMapping("/v1/validation")
public class ValidationController {
@PostMapping
public ResponseDto post(@RequestBody @Validated RequestDto request, BindingResult bindingResult){
if (bindingResult.hasErrors()) {
return new ResponseDto();
}
return new ResponseDto();
}
}
@NoArgsConstructor
@Data
public class ResponseDto {
}
ResponseDtoにフィールドが1つもありません。これは作成途中だったのですが、このエラーがとれずにかなりはまりました。
SpringBootでは、レスポンスにDTOを使用する場合、1つ以上のフィールドが存在しないと、HttpMessageNotWritableExceptionになるようです。
解決策1 何も返却しないなら、voidを返す
@CrossOrigin
@RestController
@RequestMapping("/v1/validation")
public class ValidationController {
@PostMapping
public void post(@RequestBody @Validated RequestDto request, BindingResult bindingResult){
if (bindingResult.hasErrors()) {
return;
}
}
}
もし何も返却しなくて良い場合は、ハンドラメソッドの戻り値をvoidにします。
これでエラーは発生しなくなります。
解決策2 レスポンスDTOにフィールドを持たせる
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDto {
private String hoge;
}
このように、フィールドが1つでも存在すればHttpMessageNotWritableExceptionは発生しません。