有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在JAXWS出现异常时发送自定义响应消息而不是错误消息?

在我的JAXWS web服务中,当异常发生时,我需要向客户机发送一条特定的消息,而不是带有异常描述的标准故障消息

如何做到这一点

我使用的是jaxws rt版本2.1.3

我已经尝试过像这样使用异常映射器,但运气不佳(有些异常映射器没有被调用,这也可能是由于配置中的错误造成的):

@Provider
public class ThrowableExceptionMapper implements ExceptionMapper<Throwable> {

    public ThrowableExceptionMapper() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public Response toResponse(Throwable throwable) {
        if (throwable instanceof WebApplicationException) {
            return ((WebApplicationException) throwable).getResponse();
        } else {
            return Response.serverError().entity("").build();
        }
    }
}

我们使用的服务器是JBoss EAP 6.4

编辑:
异常映射器方法不适合我的JAXWS web服务,因为这是针对JAX-RS的(感谢SRINIVAS K)。 JAXWS有类似的功能吗


共 (3) 个答案

  1. # 1 楼答案

    在这个页面的帮助下,我成功地重写了回复信息:
    http://www.java-tips.org/java-ee-tips-100042/156-java-api-for-xml-web-services/1958-writing-a-handler-in-jax-ws.html

    并以本页为例:
    http://www.programcreek.com/java-api-examples/index.php?api=javax.xml.ws.handler.MessageContext

    我把这门课放在一起:

    public class MyLogicalHandler implements LogicalHandler<LogicalMessageContext> {
        private final String RejectionResponseBody = "<ns2:MessageControllerResponse xmlns:ns2=\"http://some.namespace.com/\"><return>SOMEDATA</return></ns2:MessageControllerResponse>";
    
        @Override
        public boolean handleMessage(LogicalMessageContext context) {       
            return true;
        }
    
        @Override
        public boolean handleFault(LogicalMessageContext context) {
            processMessage(context);
            return true;
        }
    
        @Override
        public void close(MessageContext context) {
    
        }
    
        private void processMessage(LogicalMessageContext context) {
            Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    
            if (outboundProperty) {
                LogicalMessage msg = context.getMessage();
                msg.setPayload(new StreamSource(new ByteArrayInputStream(RejectionResponseBody.getBytes())));
            }
        }   
    }
    

    编辑,添加其他信息:

    您还需要将HandlerChain注释添加到web服务:

    ...
    @HandlerChain(file = "handler-chain.xml")
    public class MyWebService {
    ...
    }
    

    并创建处理程序链xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <handler-chains xmlns="http://java.sun.com/xml/ns/javaee">  
      <handler-chain>
        <handler>
          <handler-class>my.package.ws.jaxws.MyLogicalHandler</handler-class>
        </handler>
      </handler-chain>
    </handler-chains>
    

    如果将此文件放在web服务的resources文件夹中,则需要使用与web服务相同的包结构。因此,创建以下包:my。包裹如果您的web服务类位于my中,请在resources文件夹中找到ws。包裹ws软件包

  2. # 2 楼答案

    你能检查ExceptionMapper是否适用于像Throwable或Exception这样的通用异常吗
    我看到了一些使用WebFault注释配置的自定义异常示例

  3. # 3 楼答案

    你能试试下面的吗

    String errorMessage = "this is custom error message";
    return Response.status(e.getResponse().getStatus()).entity(errorMessage).build();