2016-08-01 38 views
0

Wir haben einen Jersey-Dienst, bei dem Fehlermeldungen nicht an den aufrufenden Client zurückgegeben werden, weil WebSphere den Fehler umschließt. Der Dienst funktioniert wie erwartet für die Status.OK-Antwort. Unser Problem ist, wenn wir Ausnahmen behandeln wollen. Wir haben wink (instructions here) in unserem WebSphere-Server und den gebündelten Jersey-Jars in unserer WAR-Datei deaktiviert.Jersey-Fehlerantwort von websphere umwickelt "com.ibm.ws.webcontainer.webapp.WebAppErrorReport: Interner Serverfehler"

Hier ist ein Beispiel Websphere Konsolenprotokolle:

0000010b webapp  E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[our-service]: com.ibm.ws.webcontainer.webapp.WebAppErrorReport: Internal Server Error 
at com.ibm.ws.webcontainer.webapp.WebAppDispatcherContext.sendError(WebAppDispatcherContext.java:632) 
at com.ibm.ws.webcontainer.webapp.WebAppDispatcherContext.sendError(WebAppDispatcherContext.java:662) 
at com.ibm.ws.webcontainer.srt.SRTServletResponse.sendError(SRTServletResponse.java:1301) 
at org.glassfish.jersey.servlet.internal.ResponseWriter.commit(ResponseWriter.java:199) 
at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:413) 
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:691) 
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:377) 
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:420) 
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297) 
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254) 
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030) 
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) 

Wir haben die folgende Ausnahme Mapper:

package org.sample.exception.mapper; 

import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

@Provider 
public class SampleExceptionMapper 
    implements ExceptionMapper<Exception> { 

    private static final Logger logger = LogManager.getLogger(SampleExceptionMapper.class.getName()); 

    @Override 
    public Response toResponse(Exception ex) { 
    String message = ex.getClass().getCanonicalName() + " - " + ex.getMessage(); 
    return Response.status(Status.SERVICE_UNAVAILABLE.getStatusCode()).entity(message).type(MediaType.TEXT_PLAIN).build(); 
    } 
} 

und in unserer Service-Implementierung, werfen wir die folgende Ausnahme, wenn wir Probleme beim Senden einer E-Mail haben :

package org.sample.common.exception; 

public class EmailSendingException 
    extends BaseServiceException { 

    public EmailSendingException() { 
    super(ServiceException.EMAIL_SENDING_FAILED); 
    } 
} 

public enum ServiceException { 

    EMAIL_SENDING_FAILED("Email sending failed"); 

    private String description; 

    private ServiceException(String description) { 
    this.description = description; 
    } 

    public String getDescription() { 
    return description; 
    } 
} 

Beispielcode, der den Dienst aufruft:

@Override 
    public boolean saveData(SampleData sampleData) 
    throws EmailSendingException, WebServiceException { 
    WebTarget client = RestClientBuilder.getRestClient(this.SAMPLE_URL); 
    Response response = client.request().post(Entity.entity(sampleData, MediaType.APPLICATION_JSON)); 
    boolean isSaveSuccess = false; 
    if (Status.OK.getStatusCode() == response.getStatus()) { 
     logger.info("saving data..."); 
     isSaveSuccess = true; 
    } 
    else { 
     String result = response.readEntity(String.class); 
     logger.info("result: " + result); 
     if (result.contains("Email sending failed")) { 
     throw new EmailSendingException(); // EXPECTED TO ENTER HERE 
     } 
     else { 
     throw new WebServiceException(); // BUT ALWAYS GOES HERE 
     } 
    } 
    return isSaveSuccess; 
    } 

Was müssen wir tun, damit die Fehlermeldung die aufrufende Clientklasse erreicht?

Antwort

0

diese Jersey Konfiguration in unserer web.xml Hinzufügen gelöst unser Problem:

<init-param> 
    <param-name>jersey.config.server.response.setStatusOverSendError</param-name> 
    <param-value>true</param-value> 
</init-param> 

Weiterführende Links: für Jersey und Websphere.