I am using Spring Boot version 2.1.2 and the errorAttributes.getErrorAttributes() signature didn't work for me (in acohen's response). I wanted a JSON type response so I did a little digging and found this method did exactly what I needed.
I got most of my information from this thread as well as this blog post.
First, I created a CustomErrorController that Spring will look for to map any errors to.
package com.example.error; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.WebRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; @RestController public class CustomErrorController implements ErrorController { private static final String PATH = "error"; @Value("${debug}") private boolean debug; @Autowired private ErrorAttributes errorAttributes; @RequestMapping(PATH) @ResponseBody public CustomHttpErrorResponse error(WebRequest request, HttpServletResponse response) { return new CustomHttpErrorResponse(response.getStatus(), getErrorAttributes(request)); } public void setErrorAttributes(ErrorAttributes errorAttributes) { this.errorAttributes = errorAttributes; } @Override public String getErrorPath() { return PATH; } private Map<String, Object> getErrorAttributes(WebRequest request) { Map<String, Object> map = new HashMap<>(); map.putAll(this.errorAttributes.getErrorAttributes(request, this.debug)); return map; } }
Second, I created a CustomHttpErrorResponse class to return the error as JSON.
package com.example.error; import java.util.Map; public class CustomHttpErrorResponse { private Integer status; private String path; private String errorMessage; private String timeStamp; private String trace; public CustomHttpErrorResponse(int status, Map<String, Object> errorAttributes) { this.setStatus(status); this.setPath((String) errorAttributes.get("path")); this.setErrorMessage((String) errorAttributes.get("message")); this.setTimeStamp(errorAttributes.get("timestamp").toString()); this.setTrace((String) errorAttributes.get("trace")); } // getters and setters }
Finally, I had to turn off the Whitelabel in the application.properties file.
server.error.whitelabel.enabled=false
This should even work for xml requests/responses. But I haven't tested that. It did exactly what I was looking for since I was creating a RESTful API and only wanted to return JSON.
spring.resources.add-mappings=false?/errorpath is called?