0

我有一个用 Java 构建的 SOAP Web 服务。

如果我的方法遇到异常,我想返回“HTTP CODE 500”。

可能吗?如果是怎么办?

(Web 服务在 Tomcat 6 上运行)

4

2 回答 2

2

也许您应该自己简单地抛出一个合格的异常,然后将其作为肥皂故障发送回客户端。W3C 告诉我们:

如果在处理请求时出现 SOAP 错误,SOAP HTTP 服务器必须发出 HTTP 500“内部服务器错误”响应,并在响应中包含 SOAP 消息,其中包含指示 SOAP 处理错误的 SOAP Fault 元素(参见第 4.4 节)。 http://www.w3.org/TR/2000/NOTE-SOAP-20000508/

乱用 http 响应代码可能很危险,因为其他一些客户端可能期望不同的响应。在您的情况下,您会很幸运,因为您完全想要 W3C 指定的行为。所以抛出一个异常;)

怎么做?看看这里: 如何在 JAX-WS Web 服务上引发自定义错误?

问候

巴斯蒂安

于 2013-10-23T19:23:43.263 回答
1

由于 JAX-WS 基于 servlet,您可以这样做。你可以试试下一个:

@WebService
public class Calculator {

    @Resource
    private WebServiceContext ctx;

    public int division (int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            sendError(500, "Service unavailable for you.");
            return -1; // never send
        }
    }

    private void sendError(int status, String msg) {
        try {
            MessageContext msgCtx = ctx.getMessageContext();
            HttpServletResponse response = 
               (HttpServletResponse) msgCtx.get(MessageContext.SERVLET_RESPONSE);
            response.sendError(status, msg);
        } catch (IOException e) {
            // Never happens or yes?
        }
    }

}

但是,我更喜欢使用 JAX-RS 来做类似的事情。

@PUT
@Path("test")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response update( //
        @FormParam("id") int id,
        @FormParam("fname") String fname,
        @FormParam("lname") String lname
        ) {
    try {

        // do something

        return Response.ok("Successfully updated", 
                MediaType.TEXT_PLAIN_TYPE).build();
    } catch (Exception e) {
        LOG.error("An error occurred", e);
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
                .entity("An error occurred")
                .type(MediaType.TEXT_PLAIN_TYPE).build();
    }
}
于 2013-10-23T18:57:38.117 回答