簡體   English   中英

如何在請求體中將Serializable對象的Map作為JSON傳遞

[英]How to pass Map of Serializable object as JSON in request body

模型類看起來像這樣MailFilterCondition具有EmailCondition的映射,其中Filter是一個類,MailAttributes和Operator是枚舉:

public class EmailCondition implements Serializable {
private static final long serialVersionUID = -5429392022485346125L;
private Filter.MailAttributes key;
private Filter.Operator op;
private String value;

public Filter.MailAttributes getKey() {
    return key;
}

public void setKey(Filter.MailAttributes key) {
    this.key = key;
}

public Operator getOp() {
    return op;
}

public void setOp(Operator op) {
    this.op = op;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

@Override
public String toString() {
    return "EmailCondition [key=" + key + ", op=" + op + ", value=" + value + "]";
}
}

public class MailFilterCondition implements Serializable {
private static final long serialVersionUID = -2691329267596354267L;
private int automationId;
private Map<String, EmailCondition> emailConditionMap;
private String filterString;

public int getAutomationId() {
    return automationId;
}

public void setAutomationId(int automationId) {
    this.automationId = automationId;
}

public Map<String, EmailCondition> getEmailConditions() {
    return emailConditionMap;
}

public void setEmailConditions(Map<String, EmailCondition> emailConditionMap) {
    this.emailConditionMap = emailConditionMap;
}

public String getFilterString() {
    return filterString;
}

public void setFilterString(String filterString) {
    this.filterString = filterString;
}

@Override
public String toString() {
    return "MailFilterCondition [automationId=" + automationId + ", emailConditions=" + emailConditionMap
            + ", filterString=" + filterString + "]";
}
}

控制器:

@PostMapping(value = "/email")
public void createAutomationFilter(@RequestParam(value="automation_id") int automationId, @RequestBody MailFilterCondition filterData) {

    System.out.println(filterData);
}

請求機構:

{
"automationId": 123,
"filterString": "(c1_and_c2)_or_(c1_and_c3)",
"emailConditionMap": 
{
    "c1":{
        "key": "from",
        "op": "contains",
        "value": "jhon"
    },

    "c2":{
        "key": "from1",
        "op": "starts",
        "value": "ron"
    },

    "c3":{
        "key": "from",
        "op": "contains",
        "value": "payment"
    }
}
}

過濾枚舉:

public class Filter {
public enum Operator {
    contains("contains"), starts("starts"), ends("ends"), gt("gt"), gteq("gteq"), lt("lt"), lteq("lteq"), eq("eq"),
    inlist("inlist"), pattern("pattern");
    private final String operator;

    private Operator(String opt) {
        this.operator = opt;
    }

    public String getValue() {
        return this.operator;
    }
}

public enum MailAttributes {
    from("from"), to("to"), subject("subject"), body("body"), received_time("received_time");
    private final String attribute;

    private MailAttributes(String attribute) {
        this.attribute = attribute;
    }

    public String getValue() {
        return this.attribute;
    }
}

public enum LogicOperator {
    AND("_and_"), OR("_or_");
    private final String operator;

    private LogicOperator(String opt) {
        this.operator = opt;
    }

    public String getValue() {
        return this.operator;
    }
}
}

輸出:

MailFilterCondition [automationId=123, emailConditions=null, filterString=(c1_and_c2)_or_(c1_and_c3)]

在json中傳遞鍵值對時,map屬性reamins null。 我嘗試了所有的東西,但每次emailConditions打印為null。

你在課堂上有適當的吸氣/安裝者嗎? 我不確定Filter類是什么,但將這兩個字段更改為String它是完美的。 所以問題可能就在那里。

你需要使用傑克遜編組。 它將在請求體中發送之前自動轉換對象。 傑克遜使用吸氣劑和制定者,所以你的對象必須擁有它們。

@PostMapping(value = "/email")
public void createAutomationFilter(@RequestParam(value="automation_id") int automationId, @RequestBody MailFilterCondition filterData) {

    System.out.println(filterData);
}

createAutomationFilter方法中,您傳遞@RequestParam(value="automation_id") int automationId作為參數,當您在Postman中發送請求正文中的所有參數時,這是不正確的。 因此,您必須在一個Model類(即MailFilterCondition)中映射所有參數,並使用@RequestBody注釋。 請參閱以下控制器。

控制器:

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/mail")
public class TestController {

    @PostMapping(value = "/create", produces = { "application/json" })
    public void createAutomationFilter(@RequestBody final MailFilterCondition emailConditionMap,
            final HttpServletRequest request) {
      System.out.println(emailConditionMap);

    }
}

在這個模型中, MailFilterCondition對於emailConditionMap字段的setter和getter是不合適的。

public Map<String, EmailCondition> getEmailConditions() {
    return emailConditionMap;
}

public void setEmailConditions(Map<String, EmailCondition> emailConditionMap) {
    this.emailConditionMap = emailConditionMap;
}

更新你的setter和getter(Spring用於映射與字段設置者名稱完全相同的字段)

   public Map<String, EmailCondition> getEmailConditionMap() {
    return emailConditionMap;
     }

   public void setEmailConditionMap(Map<String, EmailCondition> 
     emailConditionMap) {
    this.emailConditionMap = emailConditionMap;
    }

型號: MailFilterCondition

import java.io.Serializable;
import java.util.Map;

public class MailFilterCondition implements Serializable {
    private static final long serialVersionUID = -2691329267596354267L;
    private int automationId;
    private Map<String, EmailCondition> emailConditionMap;
    private String filterString;

    public int getAutomationId() {
        return automationId;
    }

    public void setAutomationId(int automationId) {
        this.automationId = automationId;
    }

    public Map<String, EmailCondition> getEmailConditionMap() {
        return emailConditionMap;
    }

    public void setEmailConditionMap(Map<String, EmailCondition> emailConditionMap) {
        this.emailConditionMap = emailConditionMap;
    }

    public String getFilterString() {
        return filterString;
    }

    public void setFilterString(String filterString) {
        this.filterString = filterString;
    }

    @Override
    public String toString() {
        return "MailFilterCondition [automationId=" + automationId + ", emailConditions=" + emailConditionMap
                + ", filterString=" + filterString + "]";
    }
}

在模型EmailCondition ,我將String作為參數傳遞給

public void setKey(String key) {
    this.key = Filter.MailAttributes.valueOf(key);
}

public void setOp(String op) {
    this.op = Filter.Operator.valueOf(op);
}

正如您在請求正文中看到的那樣,您將keyop值作為String傳遞,這些值不是任何類型的自定義java類。 在運行時,Spring無法找出你傳遞的類型

public void setKey(Filter.MailAttributes key) {
    this.key = key;
}

public void setOp(Operator op) {
    this.op = op;
}

據我所知,您還可以使用@InitBinder注釋綁定這些字段。

型號: EmailCondition

import java.io.Serializable;

import com.spring.web.controller.Filter.MailAttributes;
import com.spring.web.controller.Filter.Operator;

public class EmailCondition implements Serializable {

    private static final long serialVersionUID = -5429392022485346125L;
    private Filter.MailAttributes key;
    private Filter.Operator op;
    private String value;

    public void setKey(String key) {
        this.key = Filter.MailAttributes.valueOf(key);
    }

    public void setOp(String op) {
        this.op = Filter.Operator.valueOf(op);
    }

    public void setValue(String value) {
        this.value = value;
    }

    public MailAttributes getKey() {
        return key;
    }

    public Operator getOp() {
        return op;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "EmailCondition [key=" + key + ", op=" + op + ", value=" + value + "]";
    }
}

型號: Filter

public class Filter {

    public enum Operator {
        contains("contains"), starts("starts"), ends("ends"), gt("gt"), gteq("gteq"), lt("lt"), lteq("lteq"), eq(
                "eq"), inlist("inlist"), pattern("pattern");
        private final String operator;

        private Operator(String opt) {
            this.operator = opt;
        }

        public String getValue() {
            return this.operator;
        }
    }

    public enum MailAttributes {

        from("from"), to("to"), subject("subject"), body("body"), received_time("received_time");
        private final String attribute;

        private MailAttributes(String attribute) {
            this.attribute = attribute;
        }

        public String getValue() {
            return this.attribute;
        }
    }

    public enum LogicOperator {
        AND("_and_"), OR("_or_");
        private final String operator;

        private LogicOperator(String opt) {
            this.operator = opt;
        }

        public String getValue() {
            return this.operator;
        }
    }
}

您可以發送ajax請求,如下所示:

var payLoad = {

                "automationId": 123,
                "filterString": "(c1_and_c2)_or_(c1_and_c3)",
                "emailConditionMap": 
                {
                    "c1":{
                        "key": "from",
                        "op": "contains",
                        "value": "jhon"
                    },

                    "c2":{
                        "key": "to",
                        "op": "starts",
                        "value": "ron"
                    },

                    "c3":{
                        "key": "subject",
                        "op": "ends",
                        "value": "payment"
                    }
                }

           };

    $.ajax({
        url: appContextJs+"/mail/create",
        type: 'POST',
        contentType: 'application/json',
        data: JSON.stringify(payLoad),
        success: callbackfunction
    });

appContextJs:作為基本URL,例如: http://localhost:8080/webapp

請不要忘記在Postman中將contentType設置為application/json

郵差控制台輸出:

{
    "automationId": 123,
    "emailConditionMap": {
        "c1": {
            "key": "from",
            "op": "contains",
            "value": "jhon"
        },
        "c2": {
            "key": "to",
            "op": "starts",
            "value": "ron"
        },
        "c3": {
            "key": "subject",
            "op": "ends",
            "value": "payment"
        }
    },
    "filterString": "(c1_and_c2)_or_(c1_and_c3)"
}

Eclipse控制台輸出:

MailFilterCondition [automationId=123, emailConditions={c1=EmailCondition [key=from, op=contains, value=jhon], c2=EmailCondition [key=to, op=starts, value=ron], c3=EmailCondition [key=subject, op=ends, value=payment]}, filterString=(c1_and_c2)_or_(c1_and_c3)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM