我使用 Spring MVC、Jersey 和 JAXB 实现了一个 REST 应用程序。
客户端发送一个ServiceRequest
包含有关请求的信息的对象,并接收一个包含有关ServiceResponse
响应的信息的对象。
服务请求
@XmlRootElement(name = "servicerequest")
public class ServiceRequest{
String serviceName = "AddUser"
public String getServiceName() {
return serviceName;
}
@XmlElement
public void setServiceName(String serviceName) {
this.serviceName = name;
}
}
服务响应
@XmlRootElement(name = "serviceresponse")
public class ServiceResponse {
String responseCode;
public String getResponseCode() {
return responseCode;
}
@XmlElement
public void setResponseCode(String code) {
this.responseCode = name;
}
}
客户端使用 Jersey 调用服务
服务客户端
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(RESOURCE_URL);
ServiceRequest request = new ServiceRequest();
ServiceResponse response = service.path("addUser").type(MediaType.APPLICATION_XML)
.accept(MediaType.APPLICATION_XML).entity(request).post(ServiceRequest.class);
在服务器端,服务获取请求,处理它并返回一个ServiceResponse
对象。
@RequestMapping(method = RequestMethod.POST,
value = "/addUser",headers="Accept=application/xml")
@ResponseStatus(HttpStatus.OK)
public @ResponseBody ServiceResponse addUser(@RequestBody ServiceRequest request) {
ServiceResponse response = new ServiceResponse();
//Handle request
//service.addUser();
response.setCode("200");
return response;
}
上面显示的控制器类调用另一个服务类来处理请求 ( service.addUser()
)。此服务类可以引发许多异常。
我不确定如何最好地处理它们。谷歌搜索后,我发现我可以使用 ExceptionHandler 如下所示:
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public String handleException1(NullPointerException ex)
{
return ex.getMessage();
}
我可以让控制器扩展一个具有异常处理程序的基类。
关于上述方法的几个问题:
- 我必须为每种异常类型创建一个处理程序吗?我需要处理很多异常,所以不可能只为所有异常提供一个通用处理程序吗?
- 当我的控制器返回一个类型
ServiceResponse
的对象时,发生异常时返回的对象类型是什么? - 客户期望得到一个
ServiceResponse
类型的对象。如果响应是异常类型,它是如何工作的?
最后,我注意到 ExceptionHanlder 只能具有以下类型之一的返回类型:
ModelAndView
Model
Map
View
String – interpreted as a view name
void, but only if the method writes directly to the response object
我想我可以ServiceResponse
在中创建对象ExceptionHandler
并设置适当的代码并返回ServiceResponse
对象。但是,如果我无法ServiceResponse
在异常处理程序中返回类型,则这是不可能的。
编辑
我尝试使用 ExceptionHandler 使用通用异常类,如下所示
@ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody resolveServiceValidationException(ServiceException ex) {
System.out.println("In resolveServiceError");
ServiceResponse = new ServiceResponse();
response.setResponseException(ex.getMessage());
return response;
}
正在捕获异常,但 ServiceResponse 对象始终为空。我得到的只是以下消息:
GET http://localhost:8080/myService/services/pingError returned a response status of 400 Bad Request
返回异常时如何访问响应对象?
谢谢