【发布时间】:2016-08-01 07:46:53
【问题描述】:
我们有一个 Jersey 服务,其中错误消息不会返回到调用客户端,因为 Websphere 正在包装错误。对于 Status.OK 响应,该服务按预期工作。我们的问题是当我们想要处理异常时。我们在 WebSphere 服务器中禁用了 wink (instructions here),并在 WAR 文件中捆绑了 Jersey jar。
这是一个示例 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;
}
我们需要做什么才能让错误消息到达调用客户端类?
【问题讨论】:
标签: java spring web-services jersey-2.0 websphere-8