我无法通过类继承工作获得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> type) { return super.getCollectionResourceRelFor(AbstractFoo.class); } @OverrIDe public String getItemResourceRelFor(final Class> type) { return super.getItemResourceRelFor(AbstractFoo.class); } @OverrIDe public boolean supports(final Class> delimiter) { return AbstractFoo.class.isAssignableFrom(delimiter); }}
编辑
>将@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存储库所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)