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;
}
}
J'ai corrigé le JSON. Veuillez voir
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