有没有更好的方法来处理过滤器?

时间:2018-01-11 21:49:07

标签: api spring-boot jax-rs

带有SpringBootApplication的JAX-RS。

我正在构建一个API,我希望用户可以在提取数据时使用过滤器。如果他们向GET请求:

http://localhost:8100/apis/employee/?firstName=john&lastName=doe

API将返回一个或多个满足这些要求的结果。 我还希望他们只使用其中一个参数(firstName或lastName)。 我能够编写代码,它工作正常,但只有两个参数,我已经有三种可能的组合(我的API上有三种查询方法)。

 firstName = NULL && lastName = NULL (getAllEmployees case)
 firstName != NULL && lastName = NULL
 firstName = NULL && lastName != NULL
 firstName != NULL && lastName != NULL

这是我在employeeResource文件上的GET方法的样子:

@GET
@QueryParam("{firstName}, {lastName}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getEmployees(@QueryParam("firstName") String firstName, @QueryParam("lastName") String lastName) {

    List<Employee> employeeList;

    if(firstName != null && !firstName.isEmpty() && lastName != null && !lastName.isEmpty()) {

        employeeList = employeeRepository.findByFirstNameAndLastName(firstName, lastName);
    }
    else if(firstName != null && !firstName.isEmpty()) {
            employeeList = employeeRepository.findByFirstName(firstName);
    }
    else if (lastName != null && !lastName.isEmpty()) {
        employeeList = employeeRepository.findByLastName(lastName);
    }
    else {
        employeeList = (List<Employee>) employeeRepository.findAll();
    }

    if (employeeList.size() == 0) {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
    return Response.ok(employeeList).build();
}

这就是我的employeeRepository文件的样子:

public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Integer>{
    List<Employee> findByFirstName(String firstName);
    List<Employee> findByFirstNameAndLastName(String firstName, String lastName);
    List<Employee> findByLastName(String lastName);
}

如果我添加第三个参数,可能的组合方案现在是8,所以我需要在employeeRepository上定义8个查询函数,你可以想象如果你有10个可能的参数要搜索会发生什么。

有没有更好的方法来实现它,而不必定义所有这些方法?

我不介意写它们,我只是不想做一些不是最好的方法。

2 个答案:

答案 0 :(得分:0)

如果您想在回购中使用更通用的查找方法,可以使用The specification pattern。这是一个article,它在java中实现了规范模式。如果您想在REST端点上使用更通用的过滤器,可以查看OData如何格式化其查询字符串过滤器。

答案 1 :(得分:0)

您可以在EmployeeRepository上编写自定义查询,如下所示

@Query(“从员工e中选择e,其中(:firstName为null或e.firstName =:firstName)AND(:lastName为null或e.lastName =:lastName)”) list findByDifferentParams(@Param(“firstName)String firstName,@ Param(”lastName)String lastName);

如果需要,您可以添加其他参数。