Java只返回超类的属性

Java只返回超类的属性,java,json,rest,api,inheritance,Java,Json,Rest,Api,Inheritance,我正在尝试用java和spring引导创建一个API控制器。我想从特定的API端点以JSON的形式返回特定的对象,到目前为止没有什么特别的。现在我有一个子类a和一个父类B。B是抽象的,a不是抽象的,但a包含的属性比B多。我必须将超类的属性从a传递到API端点,但是当我将a对象强制转换到超类的对象时,JSON代码始终包含a的属性 除了将不相关的部分设置为null或空元素之外,还有其他方法可以防止这种情况吗 编辑: 我有以下代码: @Entity public abstract class B {

我正在尝试用java和spring引导创建一个API控制器。我想从特定的API端点以JSON的形式返回特定的对象,到目前为止没有什么特别的。现在我有一个子类a和一个父类B。B是抽象的,a不是抽象的,但a包含的属性比B多。我必须将超类的属性从a传递到API端点,但是当我将a对象强制转换到超类的对象时,JSON代码始终包含a的属性

除了将不相关的部分设置为null或空元素之外,还有其他方法可以防止这种情况吗


编辑:

我有以下代码:

@Entity
public abstract class B {
private String name;
private String description;

/* GETTERS AND SETTERS */
}

@Entity
public class A extends B {
private String moreInformation;

/* GETTERS AND SETTERS */
}


@RestController
@RequestMapping("/api/v1/")
public class ApiController {

    @RequestMapping(value = "/Bs", method = RequestMethod.GET)
    public ResponseEntity<List<B>> getBs() {
      List<A> As = DAO.getAllRelevantAsAsList();
      List<B> Bs = new ArrayList<>();
      Bs.appendAll(As);
      return new ResponseEntity<>(Bs, HttpStatus.OK);
    }

    /* DIFFERENT API ENDPOINTS */
}

通过用@JsonIgnore注释类a的属性,我找到了解决这个问题的可能方法。但是这个线程的主要问题不限于这个特殊的实现:是否可以只获取父类A的属性而不注释子类?

我相信您的选项是:

  • @JsonIgnore
    关于不希望在A中序列化的字段
  • 将Jackson ObjectMapper配置为,然后使用
    @JsonProperty
    注释您希望在B中序列化的字段
  • 将从
    getAllRelevantasList()
    返回的A实例复制到一个没有字段的新对象类型中(或者是委托给A的B的匿名实现,或者创建一个扩展B但没有新字段的新子类,并为A实例创建一个复制构造函数)

    List<B> Bs = DAO.getAllRelevantAsAsList()
        .stream()
        .map(a -> new B() { 
            public String getName() { a.getName(); } 
            public void setName(String name) { a.setName(name); }
            /** other delegated getters and setters **/
        }).collect(Collectors.toList());
    
    List Bs=DAO.getAllRelevantasList()
    .stream()
    .map(a->new B(){
    公共字符串getName(){a.getName();}
    public void setName(字符串名称){a.setName(名称);}
    /**其他委托的接受者和接受者**/
    }).collect(Collectors.toList());
    

您使用的JSON序列化库是什么?fasterxml jackson库您需要显示您尝试的代码…解决方案之一是编写自定义序列化程序。
List<B> Bs = DAO.getAllRelevantAsAsList()
    .stream()
    .map(a -> new B() { 
        public String getName() { a.getName(); } 
        public void setName(String name) { a.setName(name); }
        /** other delegated getters and setters **/
    }).collect(Collectors.toList());