我有一个 Spring Rest 控制器和一个用于控制器上 POST 方法的“命令”/DTO 对象。我还为“到期”字段之一编写了一个序列化器/反序列化器——它是一个日历对象。
由于 Jackson2 依赖项是在 pom.xml 中定义的,因此我希望 Spring 能够检测到我的反序列化器并使用它将字符串输入转换为 java.util.Calendar。但是,我收到“未找到匹配的编辑器或转换策略”异常。我的序列化器正在工作……只有反序列化器不起作用!
休息控制器 (TaskController.java)
@Controller
public class TasksController {
...
@RequestMapping(value = "/tasks", method = RequestMethod.POST)
public @ResponseBody Task createTask(@Valid TasksCommand tasksCommand){
Task task = new Task();
task.setName(tasksCommand.getName());
task.setDue(tasksCommand.getDue());
task.setCategory(tasksCommand.getCategory());
return task;
}
}
命令 /dto 对象:
public class TasksCommand {
@NotBlank
@NotNull
private String name;
@JsonDeserialize(using = CalendarDeserializer.class)
@JsonSerialize(using = CalendarSerializer.class)
private Calendar due;
private String category;
... getters & setters ...
}
日历的序列化器 - 用于我的自定义日期格式
public class CalendarSerializer extends JsonSerializer<Calendar>{
@Override
public void serialize(Calendar calendar, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss Z"); // Z - RFC 822 time zone
jgen.writeString(simpleDateFormat.format(calendar.getTime()));
}
}
日历的反序列化器
public class CalendarDeserializer extends JsonDeserializer<Calendar> {
private static Logger logger = Logger.getLogger(CalendarDeserializer.class);
@Override
public Calendar deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
String dateStr = jsonParser.getText();
logger.info("deserializing date:" + dateStr);
return Calendar.getInstance();
}
}
我在 Maven 中指定了 Jackson2 依赖项。执行 GET(此处未显示代码)时,序列化程序被正确调用,并且我看到“任务”对象的 JSON 输出。
但是,当我如下进行 HTTP POST 时
curl -X POST -d name=task1 -d category=weekly -d due=01/01/2013 http://localhost:8080/tasks
解串器从未被检测到,我得到一个异常
Failed to convert property value of type java.lang.String to required type java.util.Calendar for property due; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Calendar] for property due: no matching editors or conversion strategy found
由于检测到序列化程序,我不明白为什么没有检测到并正确调用反序列化程序。根据我的阅读,Spring 将检测到在类路径上有 Jackson2 库,它会自动将 MappingJackson2HttpMessageConverter 添加到消息转换器列表中。所以这段代码应该检测 HTTP POST 中的字符串,并使用 Deserializer 将其转换为 java.util.Calendar。我错过了什么?