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
InformationsquelleAutor Bhuvan | 2013-06-13
Schreibe einen Kommentar