我有一个用Java构建的SOAP Web服务。
如果我的方法遇到异常,我想返回“HTTP CODE 500”。
有可能吗?如果是的话怎么样?
(Web服务在Tomcat 6上运行)
答案 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();
}
}