我在我的网络应用程序中使用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"}]}
到控制器,我得到的是浏览器HTTP 400 Bad Request
,
我没有在本地websphere日志中看到任何错误,但经过一些测试后我发现问题在于将JSON数组反序列化到地图上。
我从来没有进入控制器的保存方法。
尝试了一些注释,如@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 ...
我的控制器:
@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 ...
}
}
答案 0 :(得分:1)
我看到了两个问题的解决方案:
您将持久的实体类与发送回客户端的表示类区分开来。缺点是您需要在实体
如果您使用Jackson在响应中序列化您的响应(JSON,...),您可以利用它的功能&#34;自定义序列化程序&#34;根据您的需要调整返回有效载荷的结构。有关详细信息,请参阅此答案:
希望它可以帮到你, 亨利
答案 1 :(得分:0)
在JSON中,parameters
不是对象,而是对象数组:
"parameters":[{"parameterName":"dfgdfg","parameterValue":"sdf"}, ...
您无法在
上映射此内容Map<String, String> parameters;
至少使用
List<Map<String, String>> parameters;