2016-08-04 36 views
2

當映射到Java對象時,REST API採用輸入內容類型:application/x-www-form-urlencoded,如@JsonProperty不適用於Content-Type:application/x-www-form-urlencoded

public class MyRequest { 

    @JsonProperty("my_name") 
    private String myName; 

    @JsonProperty("my_phone") 
    private String myPhone; 

    //Getters and Setters of myName and myPhone. 

    } 

在表單輸入請求中,我設置了my_name和my_phone的值,但MyRequest對象帶有myName和myPhone作爲null。

我使用傑克遜的註解2.3罐子

任何建議可能是什麼問題?

回答

2

我最近使用SpringMVC和傑克遜時遇到了同樣的問題!

在春天,當你明確地配置你的端點只消耗application/x-www-form-urlencoded請求時,Spring能夠序列化到你的POJO類中,但它不使用Jackson,因爲它不是JSON。

所以,爲了讓那些傑克遜註釋使用POJO的工作,你必須:

  1. 讓您的數據作爲地圖
  2. 解析與傑克遜的ObjectMapper
您的數據映射

在我的情況下,使用Spring,我可以解決這個問題,下面的代碼:

@RequestMapping(
     value = "/rest/sth", 
     method = RequestMethod.POST 
) 
public ResponseEntity<String> create(@RequestBody MultiValueMap paramMap) { ... } 

當您從@RequestMapping註釋中刪除「消耗」屬性時,您必須使用@RequestBody,否則Spring將無法將您的映射標識爲有效參數。

您可能會注意到的一件事是MultiValueMap不是常規地圖。每個元素值都是LinkedList,因爲http表單數據可以重複值,因此這些值將添加到該鏈接列表中。

考慮到這一點,這裏是一個簡單的代碼來獲得的第一個元素,並創建另一個地圖轉換成你的POJO:

HashMap<String, Object> newMap = new HashMap<>(); 
    Arrays.asList(new String[]{"my_name", "my_phone"}) 
      .forEach(k -> newMap.put(k, ((List<?>) paramMap.get(k)).get(0))); 

    MyRequest myrequest = new ObjectMapper().convertValue(newMap, MyRequest.class); 

我希望它可以幫助你它是如何幫助我:)

0

我認爲這個非常簡單的解決方案是使用「_」來設置與變量相關的setter。

public class MyRequest { 

    @JsonProperty("my_name") 
    private String myName; 

    @JsonProperty("my_phone") 
    private String myPhone; 

    //Getters and Setters of myName and myPhone. 

    //Setters for application/x-www-form-urlencoded 
    public void setMy_name(String name) { 
     setMyName(name); 
    } 
    ...... 
} 

還有更多的解決方案。請參閱link

相關問題