Tag: spring data rest

如何禁用Spring Data REST存储库的默认曝光?

我有一个使用spring-data-rest的项目,并且有一个只使用Spring Data的依赖项目。 这两个项目都有spring数据存储库并使用@EnableJpaRepositories来实现它们的存储库接口,但我只想在父项目中导出存储库。 这是我的问题:是否有一些方法可以将Spring Data REST配置为仅公开父项目中资源的rest端点,而无需使用@RepositoryRestResource(exported = false)显式注释依赖项目中的每个存储库? 如果我只能通过禁用它的@RepositoryRestResource执行此操作,更糟糕的是,没有其他具有不同用例的项目将能够为这些存储库启用REST端点,我的依赖项目将必须仅包含Spring Data REST …

Spring Data Rest中的存储库访问控制基于用户原理

我正在尝试实现细粒度访问控制,同时仍然利用Spring数据rest。 我正在努力保护CrudRepository以便用户只能修改或插入属于他们的数据。 我正在使用@PreAuthorize / @PostAuthorize和@PreFilter / @PostFilter将访问锁定到当前主体。 到目前为止我的存储库看起来像这样 public interface MyRepository extends CrudRepository { @PreAuthorize(“#entity.userId == principal.id”) @Override S save(S entity); @PreFilter(“filterObject.userId === principal.id”) @Override Iterable save(Iterable entities); @PostAuthorize(“returnObject.userId == principal.id”) @Override MyObject findOne(Integer integer); @PostFilter(“filterObject.userId == principal.id”) @Override Iterable findAll(); } 虽然这有点单调乏味,但它似乎完成了我所追求的目标。 (如果有人知道更好的方式,请随时告诉我!) 我遇到问题的地方是delete() , count()和exists() @Override long count(); @Override void delete(Integer integer); @Override […]

修改Spring Data Rest中没有其存储库的@OneToMany实体

在我的项目中,我使用类型为A的对象,该对象具有类型B的对象的OneToMany关系(orphanRemoval = true,cascade = CascadeType.ALL,fetch = FetchType.EAGER)。 我需要SpringDataRest(SDR)使用单个POST请求来存储完整的完整A对象及其B对象(子对象)。 我在SDR中尝试了几种组合,唯一对我有用的组合是为对象A创建@RepositoryRestResource并为对象B创建@RepositoryRestResource,但是将此( B )标记为exported = false(如果我没有创建存储库)在对象B之外 ,它将无法工作 – >只是一个对象将存储在单个POST请求中,而不是它的子类型(@OneToMany关系)类型B ;如果B存储库省略了exported = false,则会出现相同的结果)。 这是否正确,是如何实现它的唯一方法(单个POST请求同时存储所有对象)? 我之所以要问,在我之前的例子中,我必须(我想)通过使用A的存储库来控制所有对象“生命周期”。 我很好,因为A – > B关系是组合( B不存在于A之外)。 但是我有严重的问题,即使用其父存储库通过SDR编辑(也删除) B类型的某个对象(因为对象B没有导出自己的存储库)。 也许,根据定义,这是不可能的。 我试过这些解决方案: “/ A / 1 / B / 2”的PATCH不起作用 – >方法不允许(在标题中是“允许:GET,DELETE”) – >所以,PUT也是不可能的 使用json补丁内容类型[{“op”:“添加”,“路径”:“/ B / 2”,….}] – > JCH补丁无效 – PATCH为“/ A / 1” “目标数组中没有这样的索引” […]

如何在Spring-data rest中更新引用对象?

示例:课程和教师有多对一的关系,如何通过Spring-datarest改变某个课程的教师? GET http://localhost:7070/study-spring-data/course/2 响应: { “name” : “CSCI-338 Hardcore Java”, “_links” : [ { “rel” : “course.Course.teacher”, “href” : “http://localhost:7070/study-spring-data/course/2/teacher” }, { “rel” : “self”, “href” : “http://localhost:7070/study-spring-data/course/2” } ] } GET http://localhost:7070/study-spring-data/course/2/teacher 响应: { “_links” : [ { “rel” : “course.Course.teacher”, “href” : “http://localhost:7070/study-spring-data/course/2/teacher/1” } ] } 如上所示,课程2与教师1相关,如何将教师改为教师2? 我试过了: 成功更新课程名称: PUT http://localhost:7070/study-spring-data/course/2 with payload […]

Spring Data Rest 2.0.0.RELEASE以前使用RC1打破代码工作

我有一个项目,它正在使用Spring Data Rest。 我最初在我的pom.xml中有版本2.0.0.BUILD-SNAPSHOT ,但在我上次更新时,代码2.0.0.BUILD-SNAPSHOT并在访问大多数端点时开始抛出以下IllegalStateException : java.lang.IllegalStateException: No suitable resolver for argument [0] [type=org.springframework.http.converter.HttpMessageNotReadableException] HandlerMethod details: Controller [org.springframework.data.rest.webmvc.RepositoryEntityController] Method [public org.springframework.http.ResponseEntity org.springframework.data.rest.webmvc.AbstractRepositoryRestController.handleNotReadable(org.springframework.http.converter.HttpMessageNotReadableException)] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:169) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:340) at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:60) at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138) at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:75) at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1164) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at […]

为什么没有使用Spring Data JPA设置版本属性?

想知道Spring Data REST中的@Version注释如何用于ETag,我没有看到ETag由于某种原因填充 @Entity @EntityListeners(AuditingEntityListener.class) public class Venue implements Serializable { private static final long serialVersionUID = -5516160437873476233L; private Long id; … // other properties private Long version; private Date lastModifiedDate; // getters & setters @JsonIgnore @LastModifiedDate public Date getLastModifiedDate() { return lastModifiedDate; } @Version @Column public Long getVersion() { return version; } 通过文档这应该给我一个Etag值? 如图书馆的片段所示 […]

Spring Data REST – 检测到具有相同关系类型的多个关联链接

我正在尝试做一个简单的Spring应用程序。 它需要公开REST端点并将其保存到关系数据库。 我带了你的示例项目, http://spring.io/guides/gs/accessing-data-rest/ 。 我可以按照指南中的说明进行所有操作(POST,PATCH,PUT,GET)。 但是我尝试创建添加到Person Entity类的关系,事情开始崩溃。 @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String firstName; private String lastName; @OneToOne(cascade = {CascadeType.ALL}) private PersonDetails personDetails; @OneToOne(cascade = {CascadeType.ALL}) private PersonChildren personChildren; ///Getter and setters for everything except id. } @Entity public class PersonChildren { @Id @GeneratedValue(strategy = GenerationType.AUTO) […]

Spring-Data-Restvalidation器

我一直在尝试将弹簧validation器添加到spring-data-rest项目中。 我跟着并通过以下链接设置“入门”应用程序: http : //spring.io/guides/gs/accessing-data-rest/ …现在我正在尝试通过以下文档添加自定义PeopleValidator: http ://docs.spring.io/spring-data/rest/docs/2.1.0.RELEASE/reference/html/validation-chapter html的 我的自定义PeopleValidator看起来像 package hello; import org.springframework.validation.Errors; import org.springframework.validation.Validator; public class PeopleValidator implements Validator { @Override public boolean supports(Class clazz) { return true; } @Override public void validate(Object target, Errors errors) { errors.reject(“DIE”); } } …而我的Application.java类现在看起来像这样 package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; […]

如何自定义Spring Data REST以使用存储库资源的多段路径?

我正在使用Spring Data JPA和Spring Data REST开发基于组件的CRUD应用程序。 我有几个组件。 例如, 系统组件具有User模型和UserRepository 。 组件由包名称区分。 例如com.example.app. 因此,为了使我的REST API看起来更干净,我需要实现API URL,如下所示。 host:8080// 例如 host:8080/system/users 我在我的存储库中执行了以下操作 @RepositoryRestResource(collectionResourceRel = “users”, path = “system/users”) public interface UserRepository extends PagingAndSortingRepository { … } 当我转到http://localhost:8080时,会生成以下内容 { “_links”: { “users”: { “href”: “http://localhost:8080/system/users{?page,size,sort}”, “templated”: true }, … 但是当我转到http://localhost:8080/system/users 它给出了一个错误 5月22日星期五17:56:37 IST 2015出现意外错误(type = Not Found,status = 404)。 没有消息可用 […]

弹簧数据rest与复合主键

我使用spring数据rest来讨论crud。 但是当实体具有复合主键时,我不知道如何通过提供主键来获取实体。 河流类: @Entity public class River { private RiverPK id; private Double length; private Timestamp date; private String comment; @Basic @Column(name = “length”) public Double getLength() { return length; } public void setLength(Double length) { this.length = length; } @Basic @Column(name = “date”) public Timestamp getDate() { return date; } public void setDate(Timestamp date) […]