我正在开发一个简单的Web服务和客户端。请参阅我的服务片段:
@webService
public Car carData(int id) {
try {
return carDAO.getCars(id);
} catch (NullPointerException e) {
System.out.println("Error: "+e.getLocalizedMessage());
}
return null;
}
是否可以将null返回给客户端,然后客户端应该处理null或者Web服务是否更好地处理null并抛出异常?
更新: 如何返回nullpointerexception而不是返回null?
你会推荐什么?
谢谢
答案 0 :(得分:1)
您可以在JAX-WS Web服务中使用SOAP错误。这样,您可以在找不到先决条件时抛出自定义异常。客户对发生的事情有了更好的了解。
为此,您需要一个带有@WebFault
注释的异常。你可以在Using SOAP Faults and Exceptions in Java JAX-WS Web Services - Eben Hewitt on Java中找到一个很好的例子。
在Users Guide » GlassFish » Metro » JAX-WS中,您可以找到以下示例:
package fromjava.server;
import javax.jws.WebService;
@WebService
public class AddNumbersImpl {
/**
* @param number1
* @param number2
* @return The sum
* @throws AddNumbersException if any of the numbers to be added is
* negative.
*/
public int addNumbers(int number1, int number2) throws
AddNumbersException {
if (number1 < 0 || number2 < 0) {
throw new AddNumbersException("Negative number cant be " +
"added!", "Numbers: " + number1 + ", " + number2);
}
return number1 + number2;
}
}
例外:
package fromjavahandler.server;
public class AddNumbersException extends Exception {
String detail;
public AddNumbersException(String message, String detail) {
super(message);
this.detail = detail;
}
public String getDetail() {
return detail;
}
}
JAX-WS运行时自动生成故障。
答案 1 :(得分:0)
对此可能会有一百万种不同的意见,但我会告诉你我会做些什么。
通常远程服务已经能够在进行远程调用时抛出IOException
并随后失败,所以我想尽量让我的客户不必处理RuntimeException
或任何它的子类(包括NullPointerException
)。如果您的服务抛出RuntimeException
并且客户端打印出堆栈跟踪,则会让客户端开发人员感到困惑,因为堆栈跟踪与服务器上运行的代码相关,开发人员可能很少或根本无法控制。理想情况下,客户端应该只需要处理返回null
而不是预期响应的情况。如果Exception
不足以告诉客户端出现问题或问题源于客户端提供的输入问题,则只在服务器端抛出null
。
答案 2 :(得分:0)
你不应该得到NPE。如果你这样做,这可能意味着你的服务没有被初始化,你应该抛出一个IllegalStateException或回复一条消息回到客户端说Web服务不可用