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

Nov*_*ser 5 java model-view-controller spring spring-mvc

我有两个类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();
}
Run Code Online (Sandbox Code Playgroud)

我想使用单个控制器方法,它可以在A和B上工作,具体取决于前端发送的对象.所以当我尝试使用Interface时,Spring抱怨找不到合适的消息转换器.

@RequestMapping(value = "/mymethod", method = RequestMethod.POST) 
public String updateRecord(@RequestBody MyInterface myInterface, HttpServletResponse response) { 
        //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

Ram*_*n R 6

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 {

}
Run Code Online (Sandbox Code Playgroud)

那么请求正文myInterface必须是,

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

参考这三个:

Spring MVC @RequestBody 进入接口而不是类

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

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


归档时间:

查看次数:

2208 次

最近记录:

6 年,8 月 前