我在我的 Web 应用程序中使用 spring 4.0.5.RELEASE
和 jackson-databind 2.2.3
。
发送此 JSON 时:
{"keyField1":"57579","keyField2":"sdf","someField":"sdasd","parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"},{"parameterName":"erwer","parameterValue":"sdfsdf"}]}
对于 Controller 来说,我在浏览器上得到的只是一个HTTP 400 Bad Request
,
我在本地 websphere 日志中没有看到任何错误,但经过一些测试后,我发现问题出在将 JSON 数组反序列化到 map 上。
我从来没有进入 Controller 的保存方法。
尝试了一些注释,例如 @JsonDeserialize(as=HashMap.class)
但没有成功。
我该如何解决这个问题?
我的POJO:
class MyClassId implements Serializable {
private static final long serialVersionUID = 5022985493208399875L;
String keyField1;
String keyField2;
}
@Entity
@IdClass(MyClassId.class)
public class MyClass {
@Id
String keyField1;
@Id
String keyField2;
String someField;
@ElementCollection
@MapKeyColumn(name="parameterName")
@Column(name="parameterValue", length=400)
Map<String, String> parameters;
... Getters and Setters ...
我的 Controller :
@RestController
@RequestMapping("/myclass/**")
public class MyClassController {
@Transactional
@RequestMapping(value = "/save", method = RequestMethod.POST, consumes={"application/json"})
public @ResponseBody ServiceResponce<MyClass> save(@RequestBody MyClass processToSave) {
... Code ...
}
}
最佳答案
我看到您的问题有两种解决方案:
您可以区分持久化的实体类和发送回客户端的表示类。缺点是您需要在代码中从实体显式创建表示
如果您使用 Jackson 在响应中序列化您的响应(JSON,...),您可以利用它的“自定义序列化程序”功能来根据您的需要调整返回的有效负载的结构。有关更多详细信息,请参阅此答案:
- Spring 3.2 和 Jackson 2 自定义对象映射器 - Spring 3.2 and Jackson 2: add custom object mapper
- 使用 Sprint JavaCconfig 注册自定义 Jackson ObjectMapper - http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html
- ReSTLet 复杂对象到 XML 序列化 - Restlet Complex Object to XML serializaton
希望对你有帮助 蒂埃里
关于java - 使用 jackson databind 将 JSON 反序列化为 Map<String,String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28807803/