2017-04-25 73 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