2017-03-23 61 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