如何在Web服务中返回HTTP代码

时间:2013-10-23 13:57:45

标签: java web-services soap exception-handling jax-ws

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

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

有可能吗?如果是的话怎么样?

(Web服务在Tomcat 6上运行)

2 个答案:

答案 0 :(得分:2)

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

  

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

使用http响应代码进行混乱可能会有危险,因为其他一些客户端可能会遇到不同的响应。在你的情况下,你很幸运,因为你想要完全符合W3C规定的行为。所以抛出异常;)

怎么做?看看这里: How to throw a custom fault on a JAX-WS web service?

问候

的Bastian

答案 1 :(得分: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();
    }
}