![](/img/trans.png)
[英]How to write a Serializable as the body of an http post request?
[英]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);
}
正如您在請求正文中看到的那樣,您將key
和op
值作為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.