CXF/ JAX-RS : de Retour de réponse Personnalisé à partir de l'intercepteur
Nous avons besoin de retourner sur le code d'erreur et le message d'erreur lorsqu'une exception se produit pendant le REPOS de son invocation. Nous avons créé une exception mappeur de fournisseur, il fonctionne bien pour les exceptions à l'application du code. Toutefois, il ne fonctionne pas lorsque l'exception se produit à partir de la CXF code (par exemple le formulaire de la CustomValidationInterceptor que j'ai écrit).
Par exemple, si je demande avec chemin d'accès non valide paramètre (e.g non valide, numéro de téléphone). Dans ce cas, nous avons besoin de retourner un code d'erreur personnalisée et message d'erreur au format JSON, mais ça ne fonctionne pas, même si nous avons une exception mappeur fournisseur créée pour gérer WebApplicationException.
Est-il possible de gérer les exceptions de cxf intercepteurs et retour
réponse à l'utilisateur avec quelque chose comme ce qui suit?
{
"errorDetail": {
"errorCode": "404",
"errorMessage": "Bad Request"
}
}
Extrait de Code de mon 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;
}
}
Extrait de Code de ma Coutume Exception Mappeur Fournisseur de
public class TelusExceptionHandler implements ExceptionMapper<TelusServiceException> {
public Response toResponse(TelusServiceException exception) {
return Response.status(exception.getErrorDetail().getErrorCode()).entity(exception.getErrorDetail()).build();
}
}
Extrait de Code de 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);
}
}
Extrait de Code de ErrorDetail classe
@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;
}
}
Quel est le code de
TelusServiceException
's .getErrorDetail()
?ajout d'un extrait de code de TelusServiceException et ErrorDetail Objet
avez-vous essayé les filtres je pense qu'ils sont qui est appelée à chaque réponse, indépendamment de cxf invocation de la chaîne !
J'ai travaillé sur cette question, pour un de mes projets à long retour. La Réponse ci-dessous fait le tour, donc ne sais pas si les filtres sera utile ou pas
OriginalL'auteur Bhuvan | 2013-06-13
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé un moyen pour envoyer une réponse personnalisée à partir de l'intercepteur, mais ne peut toujours pas trouver un moyen d'appeler mon CustomExceptionHandler de l'intercepteur
Code:
OriginalL'auteur Bhuvan
J'ai soulevé une question similaire sur le cxf groupe d'utilisateurs, voir:
http://cxf.547215.n5.nabble.com/Handling-exceptions-in-a-JAX-RS-fault-interceptor-when-using-Local-Transport-td5733958.html
J'ai fini par le remplacement de mon intercepteurs avec ContainerRequestFilter et ContainerResponseFilter et alors, l'Exception Mappeur heureusement occupait à la fois de l'application des exceptions et les exceptions levées dans le Filtre.
Espère que cette aide.
OriginalL'auteur MandyW