Json Spring MVC REST服务和客户端。我正在寻找更好的方法来处理错误
Spring MVC REST服务和客户端。我正在寻找更好的方法来处理错误 有时我想向客户端返回错误消息或状态码,但我不知道该怎么办。有人能告诉我如何为Spring 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
@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());
}