2017-03-23 131 views
4

我有兩個類A & B它們正在實現一個接口。在彈簧控制器方法參數中使用接口

public class A implements MyInterface { 

    // Class A stuff 
    private String name; 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
this.name = name; 
} 
} 

public class B implements MyInterface { 
    //Class B stuff 

    private MyCustomClass myCustomclass; 

    public String getName() { 
    this.myCustomclass.getName(); 
} 
} 


public interface MyInterface { 

    public String getName(); 
} 

我想要使用一個控制器方法,它可以在A和B上工作,具體取決於前端發送的對象。所以當我嘗試使用Interface時,Spring並沒有發現合適的消息轉換器。

@RequestMapping(value = "/mymethod", method = RequestMethod.POST) 
public String updateRecord(@RequestBody MyInterface myInterface, HttpServletResponse response) { 
     //Do stuff 
} 
+0

可以添加A和B類的整體嗎? –

+0

已添加。如果您有任何疑問,請告訴我。 –

+0

您是否使用'jackson'進行彈簧消息映射? –

回答

1

Jackson可以確定使用哪個實現來序列化爲JSON,但它無法確定要使用哪個來反序列化JSON。對於序列化,它需要做的就是調用getClass()併爲該類型構建一個序列化器。但是,反序列化時(當前)沒有這種類型的信息。您應該使用Jackson註釋@JsonTypeInfo@JsonSubTypes來實現多態json。

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") 
@JsonSubTypes({@JsonSubTypes.Type(value = A.class, name = "A"), 
     @JsonSubTypes.Type(value = B.class, name = "B")}) 
public interface MyInterface { 

} 

然後身體myInterface必須請求,

{type:'A', name:'My name'}{type:'B', myCustomclass:{....}}

參見這三個:

Spring MVC @RequestBody into an Interface instead of a class

https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

Spring @RequestBody containing a list of different types (but same interface)

0

您是否通過傳遞對象類或通過傳遞泛型類型參考試過 public String updateRecord(@RequestBody Object obj,..

public String updateRecord(@RequestBody T obj,.. (I am not sure for this) 然後在您的控制器的方法檢查}這種。

感謝, SAURABH

0

按我的理解,春天到了/傑克遜將不能認識到要創建什麼類型的對象,除非傳入的JSON明確提到差不多。看下面的鏈接,它雖然談論抽象類。基本上有多種方式來實現這一點,使用jsonTypeinfo或參數解析器等檢查是否有幫助。 Abstract classes and Spring MVC @ModelAttribute/@RequestParam