【问题标题】:Jersey error response wrapped by websphere "com.ibm.ws.webcontainer.webapp.WebAppErrorReport: Internal Server Error"由 websphere 包裹的 Jersey 错误响应“com.ibm.ws.webcontainer.webapp.WebAppErrorReport:内部服务器错误”
【发布时间】: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


    【解决方案1】:

    在我们的 web.xml 中添加这个 Jersey 配置解决了我们的问题:

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

    相关链接:JerseyWebsphere

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-20
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多