gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:04:47 26 4
gpt4 key购买 nike

在我的 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 有类似的东西吗?

最佳答案

我成功地在此页面的帮助下重写了响应消息:
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

我整理了这个类(class):

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

关于java - 如果 JAXWS 出现异常,如何发送自定义响应消息而不是故障消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31284882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com