微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有抽象类/继承的Spring Data Rest存储库

我无法通过类继承工作获得Spring Data Rest.

我想要一个JSON端点来处理我所有的具体类.

回购:

public interface AbstractFooRepo extends keyvalueRepository

抽象类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = "type")
@JsonSubTypes({
  @JsonSubTypes.Type(value = MyFoo.class,name = "MY_FOO")
})
public abstract class AbstractFoo {
  @Id public String id;
  public String type;
}

具体类:

public class MyFoo extends AbstractFoo { }

现在用{“type”:“MY_FOO”}调用POST / abstractFoos时,它告诉我:java.lang.IllegalArgumentException:PersistentEntity不能为null!

这似乎发生了,因为Spring不知道MyFoo.

有没有办法告诉Spring Data REST关于MyFoo而不为它创建存储库和REST端点?

(我使用的是Spring Boot 1.5.1和Spring Data REST 2.6.0)

编辑:

Application.java:

@SpringBootApplication
@EnableMapRepositories
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class,args);
  }
}
最佳答案
我正在使用Spring Boot 1.5.1和Spring Data Release Ingalls.

keyvalueRepository不适用于继承.它使用每个保存对象的类名来查找相应的键值存储.例如. save(new Foo())将保存的对象放在Foo集合中.而abstractFoosRepo.findAll()将在AbstractFoo集合中查找,并且不会找到任何Foo对象.

这是使用MongoRepository的工作代码

Application.java

认的Spring Boot Application Starter.

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class,args);
  }
}

AbstractFoo.java

>我测试过include = JsonTypeInfo.As.EXISTING_PROPERTY并包含= JsonTypeInfo.As.PROPERTY.两者似乎工作正常!
>甚至可以使用自定义JacksonModule注册Jackson SubTypes.
>重要提示:强烈建议使用@RestResource(path =“abstractFoos”).否则_links.self链接将指向/ foos和/ bars而不是/ abstractFoos.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.EXISTING_PROPERTY,property = "type")
@JsonSubTypes({
  @JsonSubTypes.Type(value = Foo.class,name = "MY_FOO"),@JsonSubTypes.Type(value = Bar.class,name = "MY_Bar")
})
@Document(collection="foo_collection")
@RestResource(path="abstractFoos")
public abstract class AbstractFoo {
  @Id public String id;
  public abstract String getType();
}

AbstractFooRepo.java

这里没什么特别的

public interface AbstractFooRepo extends MongoRepository

Foo.java& Bar.java

@Persistent
public class Foo extends AbstractFoo {
  @Override
  public String getType() {
    return "MY_FOO";
  }
}

@Persistent
public class Bar extends AbstractFoo {
  @Override
  public String getType() {
    return "MY_BAR";
  }
}

FooRelProvider.java

>如果没有此部分,对象的输出将在_embedded.foos和_embedded.bars下的两个数组中分开.
> supports方法确保对于扩展AbstractFoo的所有类,对象将放在_embedded.abstractFoos中.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class FooRelProvider extends EvoInflectorRelProvider {
  @Override
  public String getCollectionResourceRelFor(final Class

编辑

>将@Persistent添加到Foo.java和Bar.java. (将它添加到AbstractFoo.java不起作用).如果没有这个注释,我在尝试在继承的类中使用JSR 303验证注释时会得到NullPointerExceptions.

重现错误的示例代码

public class A {
  @Id public String id;
  @Valid public B b;

  // @JsonTypeInfo + @JsonSubTypes
  public static abstract class B {
    @NotNull public String s;
  }

  // @Persistent <- Needed!
  public static class B1 extends B { }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...