2013-11-11 3 views
1

У меня есть форматированная строка JSON, которую я отправляю с HTTP-PUT на сервер с Spring MVC и Hibernate.Запрос, отправленный клиентом, был синтаксически неправильным, используя @DateTimeFormat

Controller:

@RequestMapping(value = "/", method = RequestMethod.PUT) 
public ResponseEntity<Map<String, Object>> myTest(
     @RequestHeader("a") String a, 
     @RequestBody MyTestClass b) { … } 

JSON:

{ 
"number":"123", 
"test":"11/14" 
} 

test является java.util.Date (MySQL -> дата) и я аннотированный POJO так:

@Column(name = "TEST") 
@DateTimeFormat(pattern = "MM/yy") 
private Date test; 

Так test следует отформатировать как месяц/год. Но я попробовал это с Firefox RESTClient, и я всегда получаю The request sent by the client was syntactically incorrect. Удаление test, все в порядке и работает так, как ожидалось.

Так кажется, что с @DateTimeFormat(pattern = "MM/yy") что-то не так?

ответ

5

Поскольку вы используете RequestBody с типом контента application/json, Spring будет использовать свой MappingJackson2HttpMessageConverter для преобразования вашего JSON в объект вашего типа. Однако указанная строка даты, 11/14 не соответствует какому-либо предварительно настроенному шаблону дат и поэтому не может ее правильно разобрать. MappingJackson2HttpMessageConverter, или, более конкретно, ObjectMapper, который выполняет эту работу, ничего не знает о @DateTimeFormat, аннотации Spring.

Вам нужно будет указать Джексону, какой шаблон даты вы хотите использовать. Вы можете сделать это с пользовательской датой десериализатором

public class CustomDateDeserializer extends JsonDeserializer<Date> { 
    @Override 
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException { 
     SimpleDateFormat format = new SimpleDateFormat("MM/yy"); 
     String date = jp.getText(); 

     try { 
      return format.parse(date); 
     } catch (ParseException e) { 
      throw new JsonParseException(e); 
     } 
    } 
} 

Тогда просто аннотировать поле так, что Джексон знает, как десериализации его.

@JsonDeserialize(using = CustomDateDeserializer.class) 
private Date test; 

Вы можете использовать @DateTimeFormat, если вы используете URL-закодированные параметры формы с @ModelAttribute. Spring регистрирует некоторые преобразователи, которые могут преобразовывать значение String из параметров запроса в объект Date. This is described in the deocumentation.

+0

Отлично работает, спасибо большое за вашу помощь! – Tim

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