スポンサーリンク

HttpMessageNotWritableException: No converter found for return value of type: class Xxx SpringBootのエラー・例外

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は発生しません。

スポンサーリンク

投稿日:

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.