2016-08-01 338 views
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; 
    } 

我们需要做些什么来让错误消息到达调用客户端类?

回答

0

添加在我们的web.xml这个配置新泽西州解决了我们的问题:

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

相关链接:JerseyWebsphere