CXF/ JAX-RS : Rückkehr Benutzerdefinierte Antwort von interceptor
Wir müssen zurückkehren benutzerdefinierten Fehler-code und Fehler-Nachricht, wenn die Ausnahme Auftritt, während der REST-Aufruf. Wir haben ein exception-mapper-Anbieter, es funktioniert gut für die Ausnahmen von der Anwendung code. Jedoch, es funktioniert nicht, wenn die Ausnahme Auftritt, aus dem CXF-code (z.B. form der CustomValidationInterceptor, die ich geschrieben habe).
Wenn ich zum Beispiel-request mit Ungültiger Pfad-parameter (e.g ungültige Telefonnummer). In diesem Fall, wir brauchen, um wieder einen benutzerdefinierten Fehler-code und Fehler-Nachricht im JSON-format, aber es funktioniert nicht, obwohl wir eine exception-mapper-Anbieter angelegt, um WebApplicationException.
Gibt es eine Möglichkeit, Ausnahmen von cxf Abfangjäger und zurück
Antwort auf Benutzer-wie so etwas wie die folgenden?
{
"errorDetail": {
"errorCode": "404",
"errorMessage": "Bad Request"
}
}
Code-Snippet von meinem CustomValidationInterceptor :
public class CustomValidationInterceptor extends AbstractPhaseInterceptor<Message>{
public CustomValidationInterceptor() {
super(Phase.PRE_INVOKE); //Put this interceptor in this phase
}
public void handleMessage(Message message) {
MetadataMap<String, String> metadataMap = (MetadataMap<String, String>) message.get("jaxrs.template.parameters");
if(null != metadataMap) {
List<String> list = metadataMap.get("phoneNumber");
if(null != list) {
String phoneNumber = list.get(0);
boolean result = validatePhoneNumber(phoneNumber);
if(!result){
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
} else {
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
} else {
throw new TelusServiceException(Response.status(Response.Status.BAD_REQUEST).build(), 400, "phone number not valid");
}
}
public boolean validatePhoneNumber(String phoneNumber) {
Pattern pattern = Pattern.compile("^[1-9]\\d{9}$");
Matcher matcher = pattern.matcher(phoneNumber);
if (!matcher.matches()) {
return false;
}
return true;
}
}
Code-Snippet meine eigene Exception-Mapper Anbieter
public class TelusExceptionHandler implements ExceptionMapper<TelusServiceException> {
public Response toResponse(TelusServiceException exception) {
return Response.status(exception.getErrorDetail().getErrorCode()).entity(exception.getErrorDetail()).build();
}
}
Code-Snippet TelusServiceException
public class TelusServiceException extends WebApplicationException{
//constructors and other methods
private ErrorDetail errorDetail = null;
public ErrorDetail getErrorDetail() {
return errorDetail;
}
public void setErrorDetail(ErrorDetail errorDetail) {
this.errorDetail = errorDetail;
}
public TelusServiceException(Response response, int errorCode, String errorMessage) {
super(response);
errorDetail = new ErrorDetail();
errorDetail.setErrorCode(errorCode);
errorDetail.setErrorMessage(errorMessage);
}
}
Code-Snippet ErrorDetail Klasse
@XmlRootElement(name="errorDetail")
public class ErrorDetail {
private int errorCode;
private String errorMessage;
@XmlElement(name = "errorCode")
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
@XmlElement(name = "errorMessage")
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
- Ich habe korrigiert, JSON. Bitte sehen
- Was ist der code von
TelusServiceException
's.getErrorDetail()
? - Hinzugefügt code-snippet TelusServiceException und ErrorDetail Objekt
- haben Sie versucht, die Filter, die ich denke, Sie sind aufgerufen, auf jede Antwort-unabhängig von cxf-Aufruf-Kette !
- Ich arbeitete auf dieses Problem in einem meiner Projekte lange zurück. Die Antwort unten war der trick also nicht wissen, ob der Filter wird hilfreich sein, oder nicht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich einen Weg gefunden, senden Sie eine benutzerdefinierte Antwort von der interceptor aber noch nicht herausfinden, einen Weg, um call my CustomExceptionHandler von der interceptor
Code:
Hob ich eine ähnliche Frage auf die cxf user group finden Sie unter:
http://cxf.547215.n5.nabble.com/Handling-exceptions-in-a-JAX-RS-fault-interceptor-when-using-Local-Transport-td5733958.html
Landete ich als Ersatz für meinen Abfangjäger mit ContainerRequestFilter und ContainerResponseFilter und dann die Exception-Mapper glücklich behandelt die Anwendung von Ausnahmen und Ausnahmen, die von dem Filter.
Hoffe, das hilft.