Json Spring MVC REST服务和客户端。我正在寻找更好的方法来处理错误

Json Spring MVC REST服务和客户端。我正在寻找更好的方法来处理错误,json,spring,rest,spring-mvc,resttemplate,Json,Spring,Rest,Spring Mvc,Resttemplate,Spring MVC REST服务和客户端。我正在寻找更好的方法来处理错误 有时我想向客户端返回错误消息或状态码,但我不知道该怎么办。有人能告诉我如何为Spring REST服务和客户端找到更好的处理错误和错误消息的方法吗 这是我的服务代码: @RequestMapping(value = "/{name}", method = RequestMethod.GET) @ResponseBody public User getName(@PathVariable String name, Mode

Spring MVC REST服务和客户端。我正在寻找更好的方法来处理错误

有时我想向客户端返回错误消息或状态码,但我不知道该怎么办。有人能告诉我如何为Spring REST服务和客户端找到更好的处理错误和错误消息的方法吗

这是我的服务代码:

@RequestMapping(value = "/{name}", method = RequestMethod.GET)
@ResponseBody
public User getName(@PathVariable String name, ModelMap model) throws ResourceNotFoundException
{

    logger.debug("I am in the controller and got user name: " + name);

    /*

        Simulate a successful lookup for 2 users, this is where your real lookup code would go

     */

    if ("user2".equals(name))
    {
        return new User("User2 Real Name", name);
    }

    if ("user1".equals(name))
    {
        return new User("User1 Real Name", name);
    }

    throw new ResourceNotFoundException("User Is Not Found");
}


 @ExceptionHandler(ResourceNotFoundException.class)
 public ModelAndView handleResourceNotFoundException(ResourceNotFoundException ex)
{
    logger.warn("user requested a resource which didn't exist", ex);
    return new ModelAndView( jsonView, "error", "user requested a resource which didn't exist");
}
下面是客户端的代码:

Map<String, String> vars = new HashMap<String, String>();
vars.put("name", "user1");


/**
 *
 * Doing the REST call and then displaying the data/user object
 *
 */
RestTemplate restTemplate = new RestTemplate(commons);
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

try
{
    User jsonreturn = restTemplate.getForObject("http://" + mRESTServer.getHost() + ":8080/json/{name}", User.class, vars);
    LOGGER.debug("return object:  " + jsonreturn.toString());
}
catch(Exception e)
{
    LOGGER.error("error:  " + e.toString());
}
我使用这种方法(使用JSON/Jackson 2)取得了很好的成功:

class ErrorHolder {
    public String errorMessage;
    public ErrorHolder(String errorMessage) {
        this.errorMessage = errorMessage;
    }
}

@ExceptionHandler
public @ResponseBody ResponseEntity<ErrorHolder> handle(ResourceNotFoundException e) {
    logger.warn("Teh resource was not found", e);
    return new ResponseEntity<ErrorHolder>(new ErrorHolder("Uh oh"), HttpStatus.NOT_FOUND);
}
类错误保持器{
公共字符串错误消息;
公共错误持有者(字符串错误消息){
this.errorMessage=errorMessage;
}
}
@例外处理程序
public@ResponseBody ResponseEntity句柄(ResourceNotFounde异常){
logger.warn(“未找到资源”,e);
返回新的ResponseEntity(新的ErrorHolder(“Uh oh”),HttpStatus.NOT_FOUND);
}

至少可以使用Spring3.2.x。

我认为主要的问题是如何处理正确返回的对象和错误的对象。 在您的客户机中:

try
{
    User jsonreturn = restTemplate.getForObject("http://" + mRESTServer.getHost() + ":8080/json/{name}", User.class, vars);
    LOGGER.debug("return object:  " + jsonreturn.toString());
}
catch(Exception e)
{
    LOGGER.error("error:  " + e.toString());
}
发生错误时,返回的对象不是用户,因此messageConverter无法正常工作

我的解决方案是:在服务器端,使用response.setStatus(HttpServletResponse.SC\u BAD\u请求)
然后客户端将不使用messageConverter、instand throw HttpClientErrorException或HttpServerErrorException,它们都有响应正文,因此您可以调用它们的e.getResponseBodyAsString()来获取错误消息。

回答此问题可能会对您有所帮助。这将为服务器端解决get问题,但对于客户端,我现在收到此消息。。rg.springframework.http.converter.httpMessageNodeTableException:无法读取JSON:客户端捕获中无法识别的字段“error”。现在,您可以将自定义错误JSON解析为适当的Java对象表示形式,从中获取所需内容并做出适当的决定。您需要在客户端处理该问题。捕获生成的HttpClientErrorException(404)并做出相应的反应。我试图在上面的代码中执行捕获,但我不知道如何在该点获取错误消息对象请查看HttpClientErrorException对象,它有一个获取包含这个错误JSON的响应体的方法。您也可以考虑实现一个定制的RetryRealRebug处理程序,在这种情况下,您可以抛出一个自定义的HtpCclitoRoRoReExchange,它包含一个将错误对象作为POJO获取的方法,而不是JSON字符串(主体)。.我肯定错过了什么。。你能告诉我上面的客户代码吗??请
try
{
    User jsonreturn = restTemplate.getForObject("http://" + mRESTServer.getHost() + ":8080/json/{name}", User.class, vars);
    LOGGER.debug("return object:  " + jsonreturn.toString());
}
catch(Exception e)
{
    LOGGER.error("error:  " + e.toString());
}