当前位置: 首页 > 知识库问答 >
问题:

实现Spring数据存储库的自定义方法并通过REST公开它们

端木昱
2023-03-14
interface PersonRepositoryCustom {
  List<Person> findByFistName(String name);
}

class PersonRepositoryImpl implements PersonRepositoryCustom, InitializingBean {
  @Override
  public void afterPropertiesSet() throws Exception {
    // initialization here
  }
  @Override
  public List<Person> findByFistName(String name) {
    // find the list of persons with the given firstname
  }
}

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
  List<Person> findByLastName(@Param("name") String name);  
}
{
  "_links" : {
    "findByLastName" : {
      "href" : "http://localhost:8080/people/search/findByLastName{?name}",
      "templated" : true
     }
  }
}

为什么FindByFirstName即使在PersonRepository接口中可用也不公开?

另外,是否有一种方法可以动态地/以编程方式添加要通过REST公开的资源库?

共有1个答案

王才英
2023-03-14

过了两天,我就这样解决了。

自定义存储库接口:

public interface PersonRepositoryCustom {
    Page<Person> customFind(String param1, String param2, Pageable pageable);
}

自定义存储库实现

public class PersonRepositoryImpl implements PersonRepositoryCustom{

    @Override
    public Page<Person> customFind(String param1, String param2, Pageable pageable) {
        // custom query by mongo template, entity manager...
    }
}
@RepositoryRestResource(collectionResourceRel = "person", path = "person")
public interface PersonRepository extends MongoRepository<Person, String>, PersonRepositoryCustom {
    Page<Person> findByName(@Param("name") String name, Pageable pageable);
}
public class PersonResource extends org.springframework.hateoas.Resource<Person>{

    public PersonResource(Person content, Iterable<Link> links) {
        super(content, links);
    }
}
@Component
public class PersonResourceAssembler extends ResourceAssemblerSupport<Person, PersonResource> {

    @Autowired
    RepositoryEntityLinks repositoryEntityLinks;

    public PersonResourceAssembler() {
        super(PersonCustomSearchController.class, PersonResource.class);
    }

    @Override
    public PersonResource toResource(Person person) {
        Link personLink = repositoryEntityLinks.linkToSingleResource(Person.class, person.getId());
        Link selfLink = new Link(personLink.getHref(), Link.REL_SELF);
        return new PersonResource(person, Arrays.asList(selfLink, personLink));
    }

}
@BasePathAwareController
@RequestMapping("person/search")
public class PersonCustomSearchController implements ResourceProcessor<RepositorySearchesResource> {

    @Autowired
    PersonRepository personRepository;

    @Autowired
    PersonResourceAssembler personResourceAssembler;

    @Autowired
    private PagedResourcesAssembler<Person> pagedResourcesAssembler;

    @RequestMapping(value="customFind", method=RequestMethod.GET)
    public ResponseEntity<PagedResources> customFind(@RequestParam String param1, @RequestParam String param2, @PageableDefault Pageable pageable) {
        Page personPage = personRepository.customFind(param1, param2, pageable);
        PagedResources adminPagedResources = pagedResourcesAssembler.toResource(personPage, personResourceAssembler);

        if (personPage.getContent()==null || personPage.getContent().isEmpty()){
            EmbeddedWrappers wrappers = new EmbeddedWrappers(false);
            EmbeddedWrapper wrapper = wrappers.emptyCollectionOf(Person.class);
            List<EmbeddedWrapper> embedded = Collections.singletonList(wrapper);
            adminPagedResources = new PagedResources(embedded, adminPagedResources.getMetadata(), adminPagedResources.getLinks());
        }

        return new ResponseEntity<PagedResources>(adminPagedResources, HttpStatus.OK);
    }

    @Override
    public RepositorySearchesResource process(RepositorySearchesResource repositorySearchesResource) {
        final String search = repositorySearchesResource.getId().getHref();
        final Link customLink = new Link(search + "/customFind{?param1,param2,page,size,sort}").withRel("customFind");
        repositorySearchesResource.add(customLink);
        return repositorySearchesResource;
    }

}
 类似资料:
  • 问题内容: 我正尝试按照1.3数据仓库的自定义实现中的描述将自定义方法添加到我的Spring数据仓库,并通过REST公开这些方法。初始代码来自使用REST示例访问JPA数据,这是添加/修改的类的代码: 运行应用程序并访问时,我得到以下响应正文: 为什么即使在界面中可用也不暴露? 另外,有没有办法动态/以编程方式添加要通过REST公开的存储库? 问题答案: 这些方法未公开的原因是,您基本上可以自由地

  • 问题内容: 据我所知,当我使用spring-data-rest时,此方法没有公开。有什么方法可以将其发布为spring-data-rest生成的REST API的一部分(无需自己创建Spring MVC Controller)? 问题答案: 我检查了代码库-似乎他们已明确禁用了自定义方法-不知道为什么。这是来自org.springframework.data.repository.core.sup

  • 假设我想有一个方法,它是获得超级主要客户,它有。 其中声明了方法。 然后我的公开存储库界面变成以下内容: 它扩展了和my。 我写的 bot不知道,在实现中写什么。如何接触客户?

  • 我有个问题。我制作了一个使用spring-data的应用程序,并使用spring-data-rest将其公开为REST服务。一切都很顺利,直到我想有一个定制的实现。我用一个附加的方法创建了一个CustomSomethingRepository和一个SomethingRepositoryImpl。Spring data repository接口扩展了CustomSomethingRepository

  • 我已经向jpa存储库添加了一个自定义方法,如http://docs.spring.io/spring-data/data-jpa/docs/1.0.x/reference/html/#repositories.custom-实施情况 就我所见,当我使用spring数据rest时,这个方法并没有公开。是否有任何方法可以将其发布为spring data REST生成的REST API的一部分(无需自己

  • 我使用的是Spring数据JPA1.10.11。释放 我有一个基础存储库,所有其他存储库都会扩展它。这部分有效。 我还想为一些要扩展的存储库声明一个自定义接口。所以我声明了一个接口和一个“Impl”类: 然后,我创建一个现有的工作存储库来扩展这个新接口: 注意:此存储库在扩展TestRepository之前工作,但是在如上扩展之后,应用程序上下文将无法以错误开始: 配置如下所示: 我觉得我一直在遵