繁体   English   中英

在Spring控制器方法参数中使用接口

[英]Use interface in Spring controller method argument

我有两个实现接口的AB类。

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 } 

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转换为接口而不是类

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

Spring @RequestBody包含不同类型的列表(但是相同的接口)

您是否尝试过传递Object类或传递泛型类型引用?

public String updateRecord(@RequestBody Object obj,..

要么

public String updateRecord(@RequestBody T obj,.. // I am not sure for this

然后在控制器方法中检查instanceOf

根据我的理解,spring / jackson将无法识别要创建的对象类型,除非传入的json明确提到相同的对象。 请参阅下面的链接,它讨论了抽象类。 基本上有多种方法可以实现这一点,使用jsonTypeinfo或参数解析器等。检查这是否有帮助。 抽象类和Spring MVC @ ModelAttribute / @ RequestParam

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM