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?