0
我们有一个Jersey服务,其中错误消息不会返回到调用客户端,因为Websphere正在封装该错误。该服务按照Status.OK响应的预期工作。我们的问题是当我们想处理异常。我们在我们的WebSphere服务器中禁用了wink(instructions here),并在我们的WAR文件中捆绑了Jersey jars。由websphere包装的泽西岛错误响应“com.ibm.ws.webcontainer.webapp.WebAppErrorReport:内部服务器错误”
下面是一个例子的Websphere控制台日志:
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)
我们有以下异常映射:
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();
}
}
,并在我们的服务实现,我们抛出了以下异常时,我们有发送电子邮件的问题:
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;
}
}
调用服务的示例代码:
@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;
}
我们需要做些什么来让错误消息到达调用客户端类?