Spring 数据 REST - 排除子类型
Spring Data REST - Exclude Subtypes
假设我有以下 Hibernate 实体(省略字段)
@Entity
@DiscriminatorColumn(name = "T")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class SuperClass {
}
@Entity
@DiscriminatorValue(name = "subClassA")
public SubClassA extends SuperClass {
}
@Entity
@DiscriminatorValue(name = "subClassB")
public SubClassB extends SuperClass {
}
使用 Spring Data REST 我会得到以下 JSON 表示:
{
"_links": {
},
"_embedded": {
"subclassA": [
{
"field1": "",
"field2": ""
}
],
"subclassB": [
{
"field1": "",
"field2": "",
"field3": ""
}
]
}
}
再次省略 _links 属性。是否有某种我可以使用的配置,以便序列化程序可以忽略子类并进行如下表示:
{
"_links": {
},
"_embedded": {
"superClass": [
{
"field1": "",
"field2": ""
},
{
"field1": "",
"field2": "",
"field3": ""
}
]
}
}
解决问题的一种方法是实施 RelProvider
。您需要做的就是实现它并将其添加到 spring 容器中(这可以完成,但即使用 @Component 注释实现)。
考虑到您只需添加以下实现即可获得您期望的响应(考虑到 spring 将对其进行扫描):
@Component
public class MessageRelProvider implements RelProvider {
public boolean supports(Class<?> arg0) {
return SuperClass.class.isAssignableFrom(arg0);
}
public String getItemResourceRelFor(Class<?> type) {
return "superClass";
}
public String getCollectionResourceRelFor(Class<?> type) {
return "superClasses";
}
}
假设我有以下 Hibernate 实体(省略字段)
@Entity
@DiscriminatorColumn(name = "T")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class SuperClass {
}
@Entity
@DiscriminatorValue(name = "subClassA")
public SubClassA extends SuperClass {
}
@Entity
@DiscriminatorValue(name = "subClassB")
public SubClassB extends SuperClass {
}
使用 Spring Data REST 我会得到以下 JSON 表示:
{
"_links": {
},
"_embedded": {
"subclassA": [
{
"field1": "",
"field2": ""
}
],
"subclassB": [
{
"field1": "",
"field2": "",
"field3": ""
}
]
}
}
再次省略 _links 属性。是否有某种我可以使用的配置,以便序列化程序可以忽略子类并进行如下表示:
{
"_links": {
},
"_embedded": {
"superClass": [
{
"field1": "",
"field2": ""
},
{
"field1": "",
"field2": "",
"field3": ""
}
]
}
}
解决问题的一种方法是实施 RelProvider
。您需要做的就是实现它并将其添加到 spring 容器中(这可以完成,但即使用 @Component 注释实现)。
考虑到您只需添加以下实现即可获得您期望的响应(考虑到 spring 将对其进行扫描):
@Component
public class MessageRelProvider implements RelProvider {
public boolean supports(Class<?> arg0) {
return SuperClass.class.isAssignableFrom(arg0);
}
public String getItemResourceRelFor(Class<?> type) {
return "superClass";
}
public String getCollectionResourceRelFor(Class<?> type) {
return "superClasses";
}
}