当前位置: 首页 > 知识库问答 >
问题:

如果JAXWS出现异常,如何发送自定义响应消息而不是故障消息?

钱渊
2023-03-14

在我的JAXWSWeb服务中,当发生异常时,我需要将特定消息发送回客户端,而不是带有异常描述的标准Fault消息。

如何做到这一点?

我使用的是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个答案

周凯捷
2023-03-14

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

容鸿畴
2023-03-14

你能试着用下面的吗?

String errorMessage = "this is custom error message";
return Response.status(e.getResponse().getStatus()).entity(errorMessage).build(); 
微生啸
2023-03-14

我设法在这个页面的帮助下重写了响应消息
http://www.java-tips.org/java-ee-tips-100042/156-java-api-for-xml-web-services/1958-writing-a-handler-in-jax-ws.html

下面是本页的一些例子:< br > http://www.programcreek.com/java-api-examples/index.php?API = javax . XML . ws . handler . message context

我把这个类放在一起:

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())));
        }
    }   
}

编辑,添加了附加信息:

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

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

并创建一个handler-chain 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 服务的资源文件夹中,您需要使用与 Web 服务相同的包结构。因此,请创建以下包:如果您的 Web 服务类驻留在资源文件夹中,my.package.ws my.package.ws 包中。

 类似资料:
  • /** 自定义消息发送接口(目前只支持文本消息发送) @param chatController 聊窗实体(必须是小能SDK创建的聊窗实体NtalkerChatController类型) @param type 消息类型: 11:文本消息 12:图片消息 13:语音消息 14:视频消息 @param message 消息内容 */ NSString *str = @“自定义文本消息test”;

  • 我想做以下事情: 感谢任何回应。 我的单元测试如下: 演示方法用于组装tlv(我们的自定义协议)对象。 关键日志如下: 创建的TcpClient工作不好,我不知道如何更正,有人能告诉我一种正确的方法吗。

  • 我想向我的whatsapp收件人发送whatsapp消息,但whatsapp收件人需要通过向您在沙盒中选择的电话号码发送“加入[关键字]”whatsapp消息来选择加入 我想发送消息而不需要发送“加入[关键字]”WhatsApp消息

  • 我是一名Java编程新手(实际上已经在学习),我对如何处理不同的消息有些怀疑。 我的目标是将这些不同的消息包含在同一个类(CustomExcpse类)中,以避免在从其他类抛出新CustomExceptions的每个方法上一遍又一遍地编写相同的字符串。 到目前为止,我编码: > 一个自定义异常类,它从异常扩展而来,具有不同的消息(在示例中只有两个,但还有更多)作为Strings包含,当然还有构造函数

  • 我试图读取来自CXF拦截器的SOAP错误消息,但我无法提取,我捕获了来自Fidler的响应 以下是菲德勒的回应 以下是我的代码 向客户端添加了FaultInterceptor

  • 我在spring boot RESTfull项目中有一些特殊情况,而不是标准的自定义身份验证异常时的错误消息。我需要一个不同的消息取决于用户名或密码是错误的,或者如果用户名不存在,或者如果用户在数据库中被停用。目前我只能得到消息,我还没有找到任何解决方案,如何根据用户属性或特殊情况自定义消息。 我当前有如下自定义身份验证提供程序: 我有这样的定制用户详细信息服务: 在哪里可以处理来自的消息,并将其