2013-07-04 2 views
1

У меня проблемы с созданием правильных сообщений об ошибках с Spring и Jackson. Сценарий: контроллер с пользовательской моделью @ResponseBody (см. Ниже) модель с двумя атрибутами, которая может привести к ошибкам синтаксического анализа. Теперь я хочу вернуть правильное сообщение об ошибке, если синтаксический разбор этих полей завершился неудачно (например, получен неверный номер для Date).Обработка ошибок с Spring и Jackson

Если произошла ошибка синтаксического анализа, Spring поймает ее и возвращает ответ 400 Bad Request с телом HTML. Хотя я могу реализовать свой собственный HandlerExceptionResolver, который улавливает это исключение для генерации значимого сообщения об ошибке. К сожалению, я могу только поймать первую ошибку синтаксического анализа, а не, возможно, вторую.

Итак, есть ли способ собрать все ошибки разбора/десериализации и создать правильное сообщение об ошибке со всеми проблемами?

Я использую Jackson 1.7.1 и Spring 3.2.2.


Некоторые примеры кода:

TimeController.java

@Controller 
@RequestMapping("/time") 
public class TimeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public @ResponseBody 
    TimeDocument create(@RequestBody TimeDocument entity) { 
     // magic 
     return entity; 
    } 
} 

TimeDocument.java

public class TimeDocument { 
    public String name; 
    public Date date1; 
    public Date date2; 
} 

Просьба 1: Я получу 200 OK.

{ 
    "name": "test", 
    "date1": 123, 
    "date2": 1234 
} 

Запрос 2: я получу 400 Bad Request, но я в состоянии генерировать соответствующее сообщение об ошибке, как: «Дата 1 имеет неверный формат».

{ 
    "name": "test", 
    "date1": "crap", 
    "date2": 1234 
} 

Запрос 3: Я получаю 400 Bad Request, но я не в состоянии генерировать соответствующее сообщение об ошибке, как: «Дата 1 имеет недопустимый формат дата 2 имеет неверный формат..».

{ 
    "name": "test", 
    "date1": "crap", 
    "date2": "crap" 
} 
+0

Поскольку я не нашел подходящего решения, все же, я собираюсь найти другой способ решить мою проблему. (например, вторая проверка клиента) – svenwltr

ответ

0

Ну, я думаю, вам лучше нужно использовать Spring MVC Form Validation или просто проверить input значения на стороне клиента, используя jquery.validate плагин (я только предполагаю, что вы используете jQuery из @ResponseBody использования).

В противном случае, другое решение, которое пришло мне в голову, чтобы реализовать что-то вроде этого:

(Прежде всего, добавьте getter и setter для нового field в вашем entity называется message, который будет хранить результат проверки).

Тогда:

@Controller 
@RequestMapping("/time") 
public class TimeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public @ResponseBody String create(@RequestBody TimeDocument entity) { 

     String json = null;   

     try { 

      //1. Create 'jackson' object mapper 
      ObjectMapper objectMapper = new ObjectMapper(); 

      //2. Capture data from your entity 
      String name = entity.getName(); 
      Date date1 = entity.getDate1(); 
      Date date2 = entity.getDate2(); 

      //3. Validate 'name', 'date1', 'date2' with some regex (a possibility) or any method you want. 

      //4. Suppossing that you implemented a method like this to validate your 'bean' or 'dto' that returns 'boolean' 
      if(!validate(entity)) { 

       //5. If everything is not according to your validation rules, set a message to your entity. 
       entity.setMessage("There was an error in the input values."); 
      } 

      //6. Convert your 'bean' or 'dto' as 'json' string 
      json = objectMapper.writeValueAsString(entity);    

     } catch (Exception ex) { 
      //handle the Exception 
     } 

     return json; 
    } 
} 

Теперь на стороне клиента (suppossing вы используете jQueryajax или просто $.post).

Выполните следующие действия в callback:

(..), function(data) { 
    if(data != null) { //Callback is not null 

     //Parse the 'String' result from 'Controller' as 'JSON' from 'Jackson' 
     var obj = $.parseJSON(data); 

     if(obj.message != '') { 
     alert(obj.message) //An error ocurred in the validation. 
     } else { 
     //Show the data 
     alert('Name: ' + obj.name + ' Date1: ' + obj.date1 + ' Date2: ' + obj.date2); 
     } 
    } 
}); 

Так что, если нет message присутствует в entity, что означает, что нет error присутствует. Я предложу это, а также рассмотрю то, что я написал в первых строках, чтобы иметь действительно хорошую проверку на client и server стороне.

+0

Это может быть идея, но она выглядит как взлом. Хотя, я буду играть с этой идеей. – svenwltr

+0

@SvenWalter Хорошо, просто дайте мне знать, как это происходит, и если вы думаете, что это ваш ответ, не забудьте его проверить. –

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