gpt4 book ai didi

java - 从 Spring MVC Rest 服务抛出的 Jersey REST 客户端捕获异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:46 31 4
gpt4 key购买 nike

我使用 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;
}

上面显示的 Controller 类调用另一个服务类来处理请求 (service.addUser())。该服务类可以引发许多异常。

我不确定如何最好地处理它们。 google 之后,我发现我可以使用如下所示的 ExceptionHandler:

@ExceptionHandler(NullPointerException.class)
@ResponseBody
public String handleException1(NullPointerException ex)
{
return ex.getMessage();
}

我可以让 Controller 扩展具有异常处理程序的基类。

关于上述方法的几个问题:

  • 我是否必须为每种异常类型创建一个处理程序?我需要处理的异常太多了,难道不可能只为所有异常设置一个通用处理程序吗?
  • 当我的 Controller 返回类型为 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

我想我可以在 ExceptionHandler 中创建 ServiceResponse 对象并设置适当的代码并返回 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

返回异常时如何访问响应对象?

谢谢

最佳答案

  1. @ExceptionHandler 注释可以将一组类作为参数,因此您可以只为多个异常创建一个(或多个)处理程序。更改方法签名以将所有已处理异常类的共同祖先作为参数。沿线的东西:

    @ExceptionHandler(value = {NullPointerException.class, AnotherException.class})
    @ResponseBody
    public String handleException1(Exception ex) {
    return ex.getMessage();
    }
  2. 在你的情况下,它将是 String,因为你用 @ResponseBody 注释了它,但你可能想将返回的 http 代码更改为某个错误代码。你可以通过添加

    @ResponseStatus(value = HttpStatus.WHATEVER_CODE_YOU_WANT, reason = "Your message")` 

    对您的异常处理程序的注释。

  3. 如果调用返回的 http 代码大于或等于 300,jersey 客户端将抛出 UniformInterfaceException。你可以捕获并处理它。在这种情况下,响应类型无关紧要,因为在转换之前会抛出异常。

更新

一旦您掌握了 UniformInterfaceException 并更改服务器上的异常处理程序,使其返回 ServiceResponse 作为响应主体,您就可以使用以下方法获取响应:

ServiceResponse response = uniformInterfaceException.getResponse().getEntity(ServiceResponse.class);

关于java - 从 Spring MVC Rest 服务抛出的 Jersey REST 客户端捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14083514/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com