È necessario restituire un codice di errore personalizzato e un messaggio di errore quando si verifica un'eccezione durante il richiamo REST. Abbiamo creato un provider di mapping di eccezioni, funziona bene per le eccezioni dal codice dell'applicazione. Tuttavia, non funziona quando si verifica un'eccezione dal codice CXF (ad esempio, modulo CustomValidationInterceptor che ho scritto).CXF/JAX-RS: Invio Risposta personalizzata dall'intercettore
Ad esempio, se si richiede un parametro percorso non valido (ad esempio numero telefonico non valido). In questo caso, dobbiamo restituire un codice di errore personalizzato e un messaggio di errore in formato JSON, ma non funziona anche se abbiamo creato un provider di mapping di eccezioni per gestire WebApplicationException.
C'è un modo per gestire le eccezioni dagli intercettori cxf e restituire la risposta all'utente con qualcosa di simile al seguente?
{
"errorDetail": {
"errorCode": "404",
"errorMessage": "Bad Request"
}
}
frammento di codice del mio 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;
}
}
frammento di codice della mia ordinazione Eccezione Mapper Provider
public class TelusExceptionHandler implements ExceptionMapper<TelusServiceException> {
public Response toResponse(TelusServiceException exception) {
return Response.status(exception.getErrorDetail().getErrorCode()).entity(exception.getErrorDetail()).build();
}
}
frammento di codice di 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);
}
}
Snippet di codice di classe ErrorDetail
@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;
}
}
Ho corretto il JSON. Si veda – Bhuvan
Qual è il codice di 'TelusServiceException'.' .getErrorDetail() '? – fge
aggiunto snippet di codice di TelusServiceException e ErrorDetail Object – Bhuvan