2013-10-23 28 views

回答

2

也许你应该简单地抛出一个合格的异常,然后将它作为soap错误发送回客户端。 W3C告诉我们这样的:

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

与HTTP响应代码搞乱可能是危险的,因为一些其他的客户可能预期不同的反应。在你的情况下,你会很幸运,因为你需要W3C指定的行为。所以抛出一个例外;)

如何做到这一点?看看这里: How to throw a custom fault on a JAX-WS web service?

问候

巴斯蒂安

+0

也许这个答案也有帮助,问题是“SOAP故障或结果对象?”:http://stackoverflow.com/a/3087265/1075628 – seafoxx

+0

感谢迄今。但是你在下面的评论中写道:“我遇到了问题。”嘿,你有一些问题,但我不会分享细节......“”......。这就是我想要的 !客户不关心任何异常细节。他只是想知道“错误或没有错误”。 –

+0

嘿丹,然后简单地抛出一个空的异常导致一个错误。您不需要共享有关问题本身的信息,但它可以帮助客户决定如何处理问题。只要你坚持使用SOAP,使用Faults(并获得免费的返回码500;) – seafoxx

1

由于JAX-WS(Web服务在Tomcat 6上运行)是基于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(); 
    } 
} 
+0

正确的JAX-RS,在那里你鼓励你更喜欢采取的所有HTTP方法和响应代码充分利用。对于JAX-WS,有更多的限制,你应该避免直接干扰http层次。你的例子(至少我认为是这样)发送一个HTTP Response 500,但没有SOAP FAULT作为响应主体,因此任何有效的JAX-WS客户端都可能遇到问题。 “嘿,你有一些问题,但我不会分享细节......” – seafoxx

相关问题