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

带有抽象类继承的Spring Data Rest存储库,第1张

概述我无法通过类继承工作获得Spring Data Rest.我想要一个JSON端点来处理我所有的具体类.回购:public interface AbstractFooRepo extends KeyValueRepository<AbstractFoo, String> {} 抽象类:@JsonTypeInfo(use = JsonTypeInfo

我无法通过类继承工作获得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@EnableMapRepositorIEspublic 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.

@SpringBootApplicationpublic 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

@Persistentpublic class Foo extends AbstractFoo {  @OverrIDe  public String getType() {    return "MY_FOO";  }}@Persistentpublic 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 { }}
总结

以上是内存溢出为你收集整理的带有抽象类/继承的Spring Data Rest存储库全部内容,希望文章能够帮你解决带有抽象类/继承的Spring Data Rest存储库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1265914.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)