如何将@RequestBody中任意名称值对的列表映射到java对象

时间:2016-05-14 00:30:38

标签: spring spring-mvc spring-boot

我正在使用Spring boot mvc来构建REST服务。 PUT输入数据类似于

@RequestMapping(value = "/cleansing", method = RequestMethod.PUT)
public ResponseEntity<Void> cleanse(@RequestBody List<CategoryItem> data) {

请注意,名称部分是任意的,值部分也是如此。如何使用spring的自动转换转换它?我的代码就像

@RequestBody List<CategoryItem> data

我知道angular-material部分不对,我不知道如何编写CategoryItem类以使其工作。什么是正确的选择?

1 个答案:

答案 0 :(得分:2)

您希望它是什么Object

作为HTTP PUT有效负载,您的签名将作为List<Map<String, String>>使用,但说实话有点笨拙。考虑到你的密钥是随机的,检索值会特别麻烦。这样的东西可用于处理整个数据集:

@RequestMapping(value = "/cleansing", method = RequestMethod.PUT)
public ResponseEntity<Void> cleanse(@RequestBody List<Map<String, String>> data) {
    for(final Map<String, String> map : data) {
        for(final Map.Entry<String, String> e : map.entrySet()) {
            System.out.println("Key: " + e.getKey() + " :: Value: " + e.getValue());
        }
    }
}

就像我说的那样......有点笨重。

更灵活的方法是使用杰克逊JsonDeserializer以及自定义类:

public class MyClassDeserializer extends JsonDeserializer<MyClass> {
    public abstract MyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        //...
    }
}

@JsonDeserialize(using=MyClassDeserializer.class)
public class MyClass {
    //...
}

然后在控制器方法中使用它:

@RequestMapping(value = "/cleansing", method = RequestMethod.PUT)
public ResponseEntity<Void> cleanse(@RequestBody MyClass data) {
    //...
}