2017-04-25 35 views
0

我建立弹簧引导后端REST API。使用弹簧启动内部@Controllers提供搜索方法

实体:

@Entity 
public class Club { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @NotNull 
    @Column(unique=true) 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

库:

@RepositoryRestResource 
public interface ClubRepository extends JpaRepository<Club, Long>, JpaSpecificationExecutor<Club> { 

} 

仅这一点就暴露了一个休息终点在http://host/clubs,太好了。现在,我想允许网址中的一些参数用于搜索目的,所以我开始遵循http://www.baeldung.com/rest-api-search-language-spring-data-specifications的说明。

但他们最终创造出一个自定义的@Controller传递请求参数:

@Controller 
public class ClubController { 

    @Autowired 
    private ClubRepository repo; 

    @RequestMapping(method = RequestMethod.GET, value = "/clubs") 
    @ResponseBody 
    public List<Club> search(@RequestParam(value = "search") String search) { 
     /* ... */ 
     return repo.findAll(spec); 
    } 
} 

所以你看,他们最终调用的存储库的findAll方法,只是路过他们建立基于该规范查询参数。很简单,但我真的很想不必为每个域对象创建额外的控制器。换句话说,有提供这种搜索通过在存储库中直接注释(例如)的@Entity,或覆盖方法(如findAll方法)的特征的方法吗?

回答

2

更好的方法是使用QueryDsl而不是标准API。春天的数据以及由此延伸,春季数据休息便会给你很多的优秀功能“自由”比一些基本的配置等。

https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#spring-data-rest

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

一个配置的存储库接口简单地变为:

@RepositoryRestResource 
public interface ClubRepository extends JpaRepository<Club, Long>, QueryDslPredicateExecutor<Club> { 

} 

端点然后可以使用的参数的动态组合被查询:

例如

http://host/clubs?name=someName

http://host/clubs?name=someName&otherProperty=X&sort=name,desc

为此需要即没有定制控制器没有进一步的代码,不规范和没有查询的方法。

对于配置的Maven简单地添加以下的POM包含您的实体模块中:这会产生必要的“查询”类。

<dependencies> 
    <dependency> 
     <groupId>com.querydsl</groupId> 
     <artifactId>querydsl-jpa</artifactId> 
     <version>${querydsl.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.querydsl</groupId> 
     <artifactId>querydsl-apt</artifactId> 
     <version>${querydsl.version}</version> 
     <scope>compile</scope> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>com.mysema.maven</groupId> 
      <artifactId>apt-maven-plugin</artifactId> 
      <version>1.1.3</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>process</goal> 
        </goals> 
        <configuration> 
         <outputDirectory>target/generated-sources/java</outputDirectory> 
         <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

.... <3 you rock – Sebas

+0

是的,我既不是工作!也许不赞成,应该是流程资源? –

+0

没有,我找到了,'的apt-Maven的插件:1.1.3:process'这不是一个标准的目标。 – Sebas