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

标签 java rest spring-boot spring-data-jpa spring-data-rest

我正在使用 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 方法,只是传递他们基于查询参数构建的规范。很简单,但我真的不想为每个域对象创建额外的 Controller 。换句话说,有没有办法通过直接注释(例如)@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

不需要更多代码,即不需要自定义 Controller 、没有规范、也没有查询方法。

要配置 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>

关于java - 使用 spring-boot 内部 @Controllers 和 @RequestParam 来提供搜索方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43608765/

相关文章:

java - 是否有任何 Java Web 应用程序可以动态地允许发布 .properties 文件的内容并让我修改它?

java - 如何获取网站的根CA?

java - 使用 Java 自动登录 Magento OAuth

http - HTTP 中的 POST 和 PUT 有什么区别?

java - 如何从 Java 中的 RESTful 服务进行 API 调用?

java - 为消费者和生产者创建休息端点

java - Procrun 日志 "missing Service ImageFile"(错误代码 1)

javascript - 如何在 HTML 中调用 REST API

java - spring jdbcTemplate 是否会删除 URL?

java - 如何向UI(Web浏览器)发送连续数据,Spring Boot