繁体   English   中英

使用spring-boot内部@Controllers和@RequestParam提供搜索方法

[英]use spring-boot internal @Controllers with @RequestParam to provide search method

我正在使用Spring Boot构建后端Rest API。

实体:

@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处公开一个休息端点,太好了。 现在,我想允许url中的某些参数用于搜索目的,因此我开始遵循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方法)来提供此搜索功能?

更好的方法是使用QueryDsl而不是标准API。 除了一些基本配置之外,Spring Data以及扩展的Spring Data Rest将为您免费提供许多出色的功能。

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM