Tag: spring data rest

如何使用Spring Boot Data Rest在同一请求中保存许多对象

我尝试使用POST方法保存一个实体数组,传递一个数组用于rest资源,但是我有一个错误: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of br.com.servtech.almox.model.Item out of START_ARRAY token at [Source: org.apache.catalina.connector.CoyoteInputStream@2af1e451; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of br.com.servtech.almox.model.Item out of START_ARRAY token at [Source: org.apache.catalina.connector.CoyoteInputStream@2af1e451; line: 1, column: 1] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:228) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readInternal(AbstractJackson2HttpMessageConverter.java:205) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE] 当我发送一个对象数据时,数据保存得非常好! 我的实体: @Entity public class […]

Spring Data REST:自定义方法validation

我正在尝试使用带有@RepositoryRestResource注释和自定义方法实现注释的Spring Data REST存储库。 有2种情况: 1)我有使用@RepositoryRestResource注释的REST存储库,它被映射到/users端点。 另外,我有@RestController ,它被映射到同一个端点。 这导致@RepositoryRestResource中的方法(应该被暴露)不可见并且在它们上获得405结果。 但是,使用@Valid注释的方法validation正在使用@RestController方法。 例如,这工作: @ResponseBody @RequestMapping(value = “/users”) public ResponseEntity signUp(@RequestBody @Valid final UserSignUpRequest userSignUpRequest) 2)与REST存储库一起工作的控制器是@RepositoryRestController控制器。 这样,在@RepositoryRestController和@RepositoryRestResource中声明的两个方法都可以正常工作。 但是JSR-303 @Valid注释方法停止工作,所以我不能使用@Valid注释 。 这个问题已经描述了DATAREST-593 。 任何想法如何解决两个问题中的至少一个? 主要思想是使用@RepositoryRestResource存储库以及自定义控制器方法和注释validation。

Spring Data REST事件不起作用

我尝试按照以下方式配置spring数据rest事件。所有类都在org.springbootjpa包中 活动: http : //docs.spring.io/spring-data/rest/docs/current/reference/html/#events 以下是我的代码 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run( DemoApplication.class, args); String[] beanNames = context.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } } @Bean GroupEventHandler groupEventHandler() { return new GroupEventHandler(); } } 事件处理程序 @RepositoryEventHandler(UserGroup.class) public class GroupEventHandler { @HandleBeforeSave public void […]

Spring Data REST:“没有String-argument构造函数/工厂方法从String值反序列化”

当我在Spring Data REST应用程序中使用Lombok来定义复杂类型时: @NoArgsConstructor @AllArgsConstructor @Data @Entity @Table(name = “BOOK”) public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(nullable = false) private Long id; private String title; @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH}) private Person author; // … } 使用Spring Data REST控制器,例如: @RepositoryRestController public class BookRepositoryRestController { private final BookRepository repository; @Autowired public BookRepositoryRestController(BookRepository repository) { […]

如何限制角色对Spring Data REST投影的访问?

在使用Spring Data JPA和Spring Data REST的应用程序中,假设您有一个这样的实体类: @Entity public class Person { @Id @GeneratedValue private int id; private String name; @JsonIgnore private String superSecretValue; … } 我们希望Spring Data REST为superSecretValue公开所有这个实体的字段EXCEPT,因此我们用@JsonIgnore注释了该字段。 但是,在某些情况下,我们要访问superSecretValue ,因此我们创建一个投影,返回所有字段,包括: @Projection(name = “withSecret”, types = {Person.class}) public interface PersonWithSecret { String getName(); String getSuperSecretValue(); } 真棒。 所以现在我们可以访问包含 superSecretValue字段的Person实体,如下所示: curl http://localhost:8080/persons?projection=withSecret 我的问题是我们如何确保这一预测 ? 我们如何配置这样的东西,以便任何人都可以在没有 superSecretValue字段的情况下检索Person实体……但只有具有特定角色的人(例如, ROLE_ADMIN )才能使用投影来检索隐藏字段? […]

QueryDsl Web查询Map字段的键

概观 特定 Spring Data JPA,Spring Data Rest,QueryDsl 一个Meetup实体 使用Map properties字段 作为@ElementCollection持久存储在MEETUP_PROPERTY表中 一个MeetupRepository 扩展了QueryDslPredicateExecutor 我期待 一个Web查询 GET /api/meetup?properties[aKey]=aValue 仅返回具有指定键和值的属性条目的Meetup:aKey = aValue。 但是,这对我不起作用。 我错过了什么? 试着 简单的领域 简单的字段起作用,如名称和描述: GET /api/meetup?name=whatever 收集领域像参与者一样工作: GET /api/meetup?participants.name=whatever 但不是这个Map字段。 自定义QueryDsl绑定 我已经尝试通过拥有存储库来自定义绑定 extend QuerydslBinderCustomizer 并凌驾于 customize(QuerydslBindings bindings, QMeetup meetup) 方法,但正在命中customize()方法时,lambda中的绑定代码不是。 编辑:了解这是因为QuerydslBindings评估查询参数的方法不要让它与它内部持有的pathSpecs映射匹配 – 它有自定义绑定。 一些细节 Meetup.properties字段 @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = “MEETUP_PROPERTY”, joinColumns = @JoinColumn(name […]

基本路径未出现在ResourceProcessor自定义链接中

在Spring Data REST中,我使用ResourceProcessor创建自定义链接: @Component public class ServiceInstanceProcessor implements ResourceProcessor<Resource> { @Override public Resource process(Resource resource) { Long id = resource.getContent().getId(); ServiceInstanceController controller = methodOn(ServiceInstanceController.class); resource.add(linkTo(controller.getNodeSummary(id)) .withRel(“nodeSummary”)); resource.add(linkTo(controller.getHealthBreakdown(id)) .withRel(“healthBreakdown”)); resource.add(linkTo(controller.getRotationBreakdown(id)) .withRel(“rotationBreakdown”)); return resource; } } 但是,生成的链接不包括基本路径,即使我已将控制器标记为@BasePathAwareController ,即使默认链接包含基本路径: { … “_links” : { “self” : { “href” : “http://localhost:8080/api/serviceInstances/101” }, “serviceInstance” : { “href” : “http://localhost:8080/api/serviceInstances/101{?projection}”, “templated” […]

Spring Data Rest / Spring Hateoas自定义控制器 – PersistentEntityResourceAssembler

我正在尝试从RepositoryRestResource向自动生成的端点添加一些额外的业务逻辑。 请参阅以下代码: 资源: @RepositoryRestResource(collectionResourceRel=”event”, path=”event”) public interface EventRepository extends PagingAndSortingRepository { } 控制器: @RepositoryRestController @RequestMapping(value = “/event”) public class EventController { @Autowired private EventRepository eventRepository; @Autowired private PagedResourcesAssembler pagedResourcesAssembler; @RequestMapping(method = RequestMethod.GET, value = “”) @ResponseBody public PagedResources getEvents(Pageable pageable, PersistentEntityResourceAssembler persistentEntityResourceAssembler) { Page events = eventRepository.findAll(pageable); return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler); } } 我查看了以下两篇stackoverflow文章: 我可以为自定义控制器镜像生成Spring-Data-Rest / […]

在自定义控制器中接受Spring Data REST URI

我有一个Spring Data Rest webmvc应用程序,我想为批处理操作添加一些自定义function。 我已经创建了一个控制器,并将其混合到uri命名空间中,但我希望它能够像自定义/search查询一样接受URI,而不仅仅是ID。 我已经尝试注册一个自定义转换器(我的实体有一个Long ID类型,但似乎被忽略。有没有办法配置我的控制器,使其采用自动实现的SDR控制器的行为? 即使有某种方法我可以调用它会自动解析一个实体的URI,这也可以正常工作(因为我可以在我的控制器中接受一个String ) 这就是我在的地方。 @Configuration public class CustomWebConfiguration extends WebMvcConfigurationSupport { //irrelevant code omitted @Bean public DomainClassConverter domainClassConverter() { DomainClassConverter dc = new DomainClassConverter(mvcConversionService()); return dc; } @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(String.class, Long.class, testConverter()); } @Bean Converter testConverter() { return new Converter() { @Override public Long convert(String […]

Spring Data Rest ManytoMany POST

首先,让我解释一下我的用例。 这很直接。 有一个用户实体和一个服务实体。 我使用UserService作为连接实体(连接表)在User和Service之间有很多关联。最初,会有一些用户和一些服务集。 用户可以随时订阅任何服务。 在这种情况下,将向UserService添加一个条目。 但是,当我尝试创建一个新的UserService关联时,我得到空指针exception。 我可以单独创建用户和服务。 我的实体是:User.java package dao.models; import java.io.Serializable; import javax.persistence.*; import com.fasterxml.jackson.annotation.JsonBackReference; @Entity @org.hibernate.annotations.Proxy(lazy=false) @Table(name=”`user`”, schema=”emm”) public class User implements Serializable { public User() { } @Column(name=”id”, nullable=false, unique=true) @Id @GeneratedValue(generator=”EMM_USER_ID_GENERATOR”) @org.hibernate.annotations.GenericGenerator(name=”EMM_USER_ID_GENERATOR”, strategy=”native”) private long id; @ManyToOne(targetEntity=dao.models.Tenant.class, fetch=FetchType.LAZY) @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK}) @JoinColumns({ @JoinColumn(name=”tenant_id”, referencedColumnName=”id”, nullable=false) }) @org.hibernate.annotations.LazyToOne(value=org.hibernate.annotations.LazyToOneOption.NO_PROXY) private dao.models.Tenant tenant; @OneToOne(targetEntity=dao.models.Person.class, fetch=FetchType.LAZY) […]