Content negotiation for ControllerAdvice
https://github.com/spring-projects/spring-framework/issues/21927
https://stackoverflow.com/a/60411766/2257038
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.HandlerMethod;
import uk.gov.api.models.metadata.ErrorResponse;
import uk.gov.api.springboot.exceptions.CorrelationIdMalformedException;
@ControllerAdvice
public class GlobalExceptionHandler {
@Autowired ContentNegotiationManager c;
@ExceptionHandler(CorrelationIdMalformedException.class)
protected ResponseEntity<ErrorResponse> handleCorrelationIdMalformedException(
CorrelationIdMalformedException ex, WebRequest request, HandlerMethod handlerMethod)
throws HttpMediaTypeNotAcceptableException {
try {
System.out.println(c.getStrategies().get(0).resolveMediaTypes((NativeWebRequest) request));
System.out.println(c.getStrategy(HeaderContentNegotiationStrategy.class).resolveMediaTypes((NativeWebRequest) request));
} catch (HttpMediaTypeNotAcceptableException e) {
// ErrorResponse errorResponse = new ErrorResponse();
// return new ResponseEntity<>(errorResponse, HttpStatus.NOT_ACCEPTABLE);
throw e;
}
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setError(ErrorResponse.Error.INVALID_REQUEST);
errorResponse.setErrorDescription(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
}
Edited by Jamie Tanna