添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

HttpMediaTypeNotAcceptableException: Could not find acceptable representation for @ControllerAdvice

Ask Question

I need to add @ControllerAdvice class to handle exceptions and return body with a message from the exception.

But when checking via postman, I keep getting the default body with 500Internal Server Error even though the breakpoint inside my ControllerAdvice class method fires.

console log:

WARN 24909 --- [nio-8081-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.javalibrary.controller.ControllerAdvice#handleApplicationException(RuntimeException)
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:315) ~[spring-webmvc-5.3.18.jar:5.3.18]
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) ~[spring-webmvc-5.3.18.jar:5.3.18]

Response body:

"timestamp": "2022-04-18T19:13:14.183+00:00", "status": 500, "error": "Internal Server Error", "path": "/api/v1/book/1"

My ControllerAdvice class:

@org.springframework.web.bind.annotation.ControllerAdvice
public class ControllerAdvice {
    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    ResponseEntity<ErrorResponse> handleApplicationException(RuntimeException e) {
        return ResponseEntity.badRequest().body(new ErrorResponse(e.getMessage()));

build.gradle plugins:

plugins {
    id 'org.springframework.boot' version '2.6.6'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'

build.gradle dependencies:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    implementation 'com.github.cloudyrock.mongock:mongock-spring-v5:4.1.14'
    implementation 'com.github.cloudyrock.mongock:mongodb-springdata-v3-driver:4.1.14'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

The reason for the error was that I have no public getters for ErrorResponse.

So my class looked like this.

@AllArgsConstructor
class ErrorResponse {
    private final String message;

Correct example 1:

class ErrorResponse {
    private final String message;
    public ErrorResponse(String message) {
        this.message = message;
    public String getMessage() {
        return message;

Correct example 2 (with Lombok):

@Data
class ErrorResponse {
    private final String message;

Correct example 3 (with record):

record ErrorResponse(String message) { }

Spring is just telling you that it doesn't know how to properly serialize the response. The fact that you're getting this exception on the response side of things tells me that you're asking for a representation that you haven't registered a negotiator for.

When you make the request, make sure that you send an Accept header of either application/json, if you're using json, or */* and let Spring just decide (in which case you'll probably get json unless you've overridden this). You also can send the request without the Accept header at all.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.