如何将自定义方法添加到Spring Data Rest JPA实现中并利用HAEOS支持



我有一个Spring Data Rest Repository控制器,它使用JPA进行查询实现,我需要添加一些自定义查询方法,这些方法无法使用JPA支持的标准queryByExample方法来完成。我已经创建了一个Impl类,它有必要的方法,但我无法识别它。我看到我可以使用标准的SpringMVC控制器,但我希望有一个统一的API,基本上我真正想要的就是实现我自己的自定义/搜索方法。

即使使用自定义控制器,问题也在于不再提供HAL链接和其他相关项目。

Spring的人能花一些时间让别人记录如何做一些更高级的事情吗?我猜,有时必须实现自己的搜索方法是相当常见的,花时间弄清楚如何做到这一点是很好的。

一个简单的实现可能如下所示:

@BasePathAwareController
class CustomInvocationsController implements ResourceProcessor<RepositorySearchesResource> {
private final YourRepository repository;
public CustomInvocationsController(YourRepository repository) {
this.repository = repository;
}
@RequestMapping(…)
ResponseEntity<?> handleRequest(PersistentEntityResourceAssembler assembler)
// invoke repository
// Use assembler to build a representation
// return ResponseEntity
}
@Override
public RepositorySearchesResource process(RepositorySearchesResource resource) {
// add Link to point to the custom handler method
}
}

需要注意的几点:

  • 使用@BasePathAwareController而不是普通的@Controller可以确保无论您将处理程序方法映射到什么,它都会考虑您在Spring Data REST上配置的基本路径
  • 在请求映射中,使用您从SpringMVC中已经知道的一切,选择一个合适的HTTP方法
  • PersistentEntityResourceAssembler基本上抽象了在PersistentEntityResource中建立表示模型,以便Spring Data REST对关联等的特定处理开始生效(关联变成链接等)
  • 实现CCD_ 5以后处理为呈现所有搜索的资源返回的CCD_。目前,无法确定资源呈现的域类型。我提交并修复了DATAREST-515以改进这一点

好的,根据目前提供的信息,我有一些工作,我认为是有意义的。到目前为止,我肯定在找人来验证我的理论。

目标是能够实现SDR已经提供的方法之外的其他自定义方法。这是因为我需要实现额外的逻辑,这些逻辑不能表示为简单的Spring Data Repository查询方法(findByXXX方法)。在这种情况下,我希望查询其他数据源,如Solr,并在返回数据之前提供对数据的自定义操作。

我已经根据@oliver的建议实现了一个控制器,如下所示:

@BasePathAwareController
@RequestMapping(value = "/persons/search")
public class PersonController implements ResourceProcessor<RepositorySearchesResource>, ResourceAssembler<Person, Resource<Person>> {
@Autowired
private PersonRepository repository;
@Autowired
private EntityLinks entityLinks;
@RequestMapping(value = "/lookup", method = RequestMethod.GET)
public ResponseEntity<Resource<Person>> lookup(@RequestParam("name") String name)
{
try
{
Resource<Person> resource = toResource(repository.lookup(name));
return new ResponseEntity<Resource<Person>>(resource, HttpStatus.OK);
}
catch (PersonNotFoundException nfe)
{
return new ResponseEntity<Resource<Person>>(HttpStatus.OK);
}
}
@Override
public RepositorySearchesResource process(RepositorySearchesResource resource) {
LinkBuilder lb = entityLinks.linkFor(Person.class, "name");
resource.add(new Link(lb.toString() + "/search/lookup{?name}", "lookup"));
return resource;
}
@Override
public Resource<Person> toResource(Person person) {
Resource<IpMaster> resource = new Resource<Person>(person);
return resource;
}

这将生成一个被视为模板的"查找"方法,当您在/persons/search上执行查询时,该方法会与Repository中定义的其他搜索方法一起列出。它没有使用建议的PersistentEntityResourceAssembler。我想我宁愿使用它,但后来我有点困惑,不知道如何注入它,以及关于已提交错误的评论意味着什么。

请参阅最新文档,因为SDR的最新版本对此有更多详细信息,并使其变得更容易。关键是要使用@RepositoryRestController注释,以便能够在/search端点下添加其他方法,或者如果要将端点添加到url命名空间的其他部分,则使用@BasePathAwareController注释。然后将PersistentEntityResourceAssembler作为参数包含到控制器方法中,并在返回实体对象时使用它来生成HAL输出。

最新更新