Spring 数据休息 - 添加 link 到搜索端点
Spring Data Rest - Add link to search endpoint
在我们的 Spring-Data-Rest 项目中,我们在 /buergers/search/findBuergerFuzzy?searchString="..." 端点上进行自定义(模糊)搜索。
是否可以在 /buergers/search 端点为其添加 link(不覆盖自动公开的 Repository findBy 方法)?
显示搜索的控制器:
@BasePathAwareController
@RequestMapping("/buergers/search/")
public class BuergerSearchController {
@Autowired
QueryService service;
@RequestMapping(value = "/findBuergerFuzzy", method = RequestMethod.GET)
public
@ResponseBody
ResponseEntity<?> findBuergerFuzzy(PersistentEntityResourceAssembler assembler, @Param("searchString") String searchString) {
if (searchString.length() < 3)
throw new IllegalArgumentException("Search String must be at least 3 chars long.");
List<Buerger> list = service.query(searchString, Buerger.class, new String[]{"vorname", "nachname", "geburtsdatum", "augenfarbe"});
final List<PersistentEntityResource> collect = list.stream().map(assembler::toResource).collect(Collectors.toList());
return new ResponseEntity<Object>(new Resources<>(collect), HttpStatus.OK);
}
}
更新:这是一个过时的解决方法。升级到 Spring HATEOAS 1.0。
旧解决方法:
挖掘 spring-data-rest 源,我发现 RepositorySearchesResource 似乎可以解决问题。
@Component
public class SearchResourcesProcessor implements ResourceProcessor<RepositorySearchesResource> {
@Override
public RepositorySearchesResource process(RepositorySearchesResource repositorySearchesResource) {
final String search = repositorySearchesResource.getId().getHref();
final Link findFullTextFuzzy = new Link(search + "/findFullTextFuzzy{?q}").withRel("findFullTextFuzzy");
repositorySearchesResource.add(findFullTextFuzzy);
return repositorySearchesResource;
}
}
因为我们通过模板生成这段代码,这就足够了,可以满足我们的需求。请确保检查评论以了解正确和安全的方式。
版本
ResourceSupport is now RepresentationModel
Resource is now EntityModel
Resources is now CollectionModel
PagedResources is now PagedModel
代码
新版本代码:
import org.springframework.data.rest.webmvc.RepositorySearchesResource;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.server.RepresentationModelProcessor;
import org.springframework.stereotype.Component;
@Component
public class RepositorySearchesProcessor implements RepresentationModelProcessor<RepositorySearchesResource> {
@Override
public RepositorySearchesResource process(RepositorySearchesResource model) {
System.out.println(model.getDomainType());
model.add(Link.of(model.getRequiredLink("self").getHref() + "/findFullTextFuzzy{?q}").withRel("findFullTextFuzzy"));
return model;
}
}
如何
关于如何找到你使用的资源或模型,在RepresentationModel
的每个方法中设置断点后,你可能会发现一些有用的东西:
在我们的 Spring-Data-Rest 项目中,我们在 /buergers/search/findBuergerFuzzy?searchString="..." 端点上进行自定义(模糊)搜索。
是否可以在 /buergers/search 端点为其添加 link(不覆盖自动公开的 Repository findBy 方法)?
显示搜索的控制器:
@BasePathAwareController
@RequestMapping("/buergers/search/")
public class BuergerSearchController {
@Autowired
QueryService service;
@RequestMapping(value = "/findBuergerFuzzy", method = RequestMethod.GET)
public
@ResponseBody
ResponseEntity<?> findBuergerFuzzy(PersistentEntityResourceAssembler assembler, @Param("searchString") String searchString) {
if (searchString.length() < 3)
throw new IllegalArgumentException("Search String must be at least 3 chars long.");
List<Buerger> list = service.query(searchString, Buerger.class, new String[]{"vorname", "nachname", "geburtsdatum", "augenfarbe"});
final List<PersistentEntityResource> collect = list.stream().map(assembler::toResource).collect(Collectors.toList());
return new ResponseEntity<Object>(new Resources<>(collect), HttpStatus.OK);
}
}
更新:这是一个过时的解决方法。升级到 Spring HATEOAS 1.0。
旧解决方法:
挖掘 spring-data-rest 源,我发现 RepositorySearchesResource 似乎可以解决问题。
@Component
public class SearchResourcesProcessor implements ResourceProcessor<RepositorySearchesResource> {
@Override
public RepositorySearchesResource process(RepositorySearchesResource repositorySearchesResource) {
final String search = repositorySearchesResource.getId().getHref();
final Link findFullTextFuzzy = new Link(search + "/findFullTextFuzzy{?q}").withRel("findFullTextFuzzy");
repositorySearchesResource.add(findFullTextFuzzy);
return repositorySearchesResource;
}
}
因为我们通过模板生成这段代码,这就足够了,可以满足我们的需求。请确保检查评论以了解正确和安全的方式。
版本
ResourceSupport is now RepresentationModel
Resource is now EntityModel
Resources is now CollectionModel
PagedResources is now PagedModel
代码
新版本代码:
import org.springframework.data.rest.webmvc.RepositorySearchesResource;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.server.RepresentationModelProcessor;
import org.springframework.stereotype.Component;
@Component
public class RepositorySearchesProcessor implements RepresentationModelProcessor<RepositorySearchesResource> {
@Override
public RepositorySearchesResource process(RepositorySearchesResource model) {
System.out.println(model.getDomainType());
model.add(Link.of(model.getRequiredLink("self").getHref() + "/findFullTextFuzzy{?q}").withRel("findFullTextFuzzy"));
return model;
}
}
如何
关于如何找到你使用的资源或模型,在RepresentationModel
的每个方法中设置断点后,你可能会发现一些有用的东西: