无法在JpaSpecificationExecutor存储库中使用findAll(Specifications,Pageable)方法。 我有以下存储库接口:
package com.task.task.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import com.task.task.domain.Employee;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long>, JpaSpecificationExecutor<Employee> {
}
每当我调用employeeRepository.findAll(specifications, pageable);时,就会抛出这个错误:
"error": "Internal Server Error",
"exception": "org.springframework.beans.BeanInstantiationException",
"message": "Failed to instantiate [org.springframework.data.jpa.domain.Specifications]: No default constructor found;
nested exception is java.lang.NoSuchMethodException: org.springframework.data.jpa.domain.Specifications.<init>()",
"path": "/api/task/employee"
这是堆栈跟踪信息:
2018-01-17 14:41:29.816 ERROR 12132 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.jpa.domain.Specifications]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.data.jpa.domain.Specifications.<init>()] with root cause
java.lang.NoSuchMethodException: org.springframework.data.jpa.domain.Specifications.<init>()
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_144]
at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_144]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:102) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
完整代码:https://github.com/SanketKD/SpecificationExecutor
实体:
@Entity
@Table(name = "emp111")
public class Employee {
@Id
@Column(name = "employee_id")
private Long employeeId;
@Column(name = "ename", length = 20)
private String ename;
@Column(name = "hire_date")
private Date hireDate;
@Column(name = "salary")
private Long salary;
@Column(name = "skills", length = 30)
private String skills;
// getters setters
服务:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specifications;
import org.springframework.stereotype.Service;
import com.task.task.domain.Employee;
import com.task.task.repository.EmployeeRepository;
@Service
public class EmployeeService {
private final EmployeeRepository employeeRepository;
@Autowired
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public Employee getEmployee(Long employeeId) {
return employeeRepository.findOne(employeeId);
}
public Page<Employee> getEmployees(Specifications<Employee> specifications, Pageable pageable) {
return employeeRepository.findAll(specifications, pageable);
}
}
控制器:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specifications;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.task.task.domain.Employee;
import com.task.task.service.EmployeeService;
@RestController
@RequestMapping("api/task/employee")
public class EmployeeController {
private final EmployeeService employeeService;
@Autowired
public EmployeeController(EmployeeService employeeService) {
this.employeeService = employeeService;
}
@RequestMapping(method = RequestMethod.GET, path = "/{employeeId:[0-9]\\d*}")
public Employee getEmployee(@PathVariable Long employeeId) {
return this.employeeService.getEmployee(employeeId);
}
@RequestMapping(method = RequestMethod.GET)
public Page<Employee> getEmployees(Specifications<Employee> specifications, Pageable pageable) {
return this.employeeService.getEmployees(specifications, pageable);
}
}
代码仓库:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import com.task.task.domain.Employee;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long>, JpaSpecificationExecutor<Employee> {
}
Specifications <Employee>
规范或者EmployeeSpecs.employeeName(name)
吗? - PAA