2013-06-07 2 views
1

Служба сервиса и клиента Spring MVC. Я ищу лучший способ справиться с ошибками!Служба сервиса и клиента Spring MVC. Я ищу лучший способ справиться с ошибками

Иногда я хотел бы вернуть сообщение об ошибке клиенту или код состояния, но я не знаю hiow. Может кто-то пожалуйста, скажите мне, как найти лучший способ борьбы с ошибками и messags ошибок для 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()); 
} 

Я хочу найти так, как вернуть код состояния и сообщение, если пользователь не найден, и плюс мой код клиента получает эту ошибку:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "error" 
+0

Ответ на этот вопрос может помочь вам. http://stackoverflow.com/questions/5097134/spring-exceptionhandler-does-not-work-with-responsebody – digitaljoel

+0

это будет работать на стороне сервера, но для клиента я получаю это сообщение .. rg.springframework .http.converter.HttpMessageNotReadableException: не удалось прочитать JSON: непризнанное поле «ошибка» – user2428795

+0

в catch на вашем клиенте теперь вы можете проанализировать свою пользовательскую ошибку JSON для соответствующего представления объекта Java и получить то, что вы хотите оттуда, и принять соответствующие решения , – digitaljoel

ответ

2

Я использовал этот подход (с 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); 
} 

Работает с Спринг 3.2.x, по крайней мере.

+0

, но затем я получаю сообщение об ошибке в коде клиента. – user2428795

+0

Вам нужно обработать это на стороне клиента. Поймайте полученное HttpClientErrorException (404) и отреагируйте на него соответствующим образом. – Jukka

+0

Я пытаюсь сделать catch в приведенном выше коде, но я не вижу, как я могу получить объект сообщения об ошибке в этой точке – user2428795

0

Я думаю, что основной момент заключается в том, как иметь дело с правильным возвращенным объектом и неправильным объектом. в вас клиент:

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_BAD_REQUEST); тогда клиент не будет использовать messageConverter, instand throw HttpClientErrorException или HttpServerErrorException, все имеют тело ответа, поэтому вы можете вызвать их e.getResponseBodyAsString(), чтобы получить сообщение об ошибке.

Смежные вопросы