我正在尝试使用java和spring boot创建一个API控制器。我想从特定的API端点返回特定对象作为JSON,到目前为止没什么特别的。现在我有一个子类A和一个父类B.B是抽象的,A不是抽象的,但A包含的属性多于B.我必须将超类的属性从A传递给API端点,但是当我强制转换时作为超类对象的对象,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 */
}
API端点生成的JSON代码如下所示:
[
{
"name": "CONTENT",
"description": "CONTENT",
"moreInformation": "CONTENT"
},
...
]
我通过使用@JsonIgnore注释类A的属性找到了解决此问题的可能方法。但是这个线程的主要问题不仅限于这个特殊的实现:是否有可能只获取父类A的属性而不注释子类?
答案 0 :(得分:0)
我相信您的选择是:
@JsonIgnore
关于您不希望在A中序列化的字段。@JsonProperty
注释要在B中序列化的字段。将从getAllRelevantAsAsList()
返回的A实例复制到一个没有字段的新对象类型中(B的匿名实现委托给a,或者创建一个扩展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());