代码之家  ›  专栏  ›  技术社区  ›  Erfan Bashar

Springboot服务类返回null引用

  •  -1
  • Erfan Bashar  · 技术社区  · 2 年前

    作为Springboot学习的一部分,我创建了一个Employee Service Implementation类和一个Emperoyee Service接口。我的数据库表中有数据,但出现以下错误

    java.lang.NullPointerException:由于“this.employeeService”为null,因此无法调用“com.example.demo.eimplementation.EmployeServiceImpl.listEmployees(int)”

    这是我的服务实现类

    
    import com.example.demo.model.Employee;
    import com.example.demo.repository.EmployeeRepository;
    import com.example.demo.service.EmployeeService;
    import jakarta.transaction.Transactional;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.stereotype.Service;
    import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
    
    import java.util.Collection;
    import java.util.Random;
    
    @RequiredArgsConstructor
    @Service
    @Transactional
    @Slf4j
    public class EmployeeServiceImpl implements EmployeeService {
    
        private final EmployeeRepository employeeRepository;
        @Override
        public Employee createEmployee(Employee employee) {
            log.info("Saving new employee: {}", employee.getEmployeeId());
            employee.setImageUrl(setEmployeeImageUrl());
            return employeeRepository.save(employee);
        }
    
        @Override
        public Collection<Employee> listEmployees(int limit) {
            log.info("Fetching all employees");
            return employeeRepository.findAll(PageRequest.of(0, limit)).toList();
        }
    
        @Override
        public Employee getEmployee(String employeeId) {
            log.info("Fetching employee by ID: {}", employeeId);
            return employeeRepository.findByEmployeeId(employeeId);
        }
    
        @Override
        public Employee updateEmployee(Employee employee) {
            log.info("Updating employee {}", employee.getEmployeeId());
            return employeeRepository.save(employee);
        }
    
        @Override
        public Boolean deleteEmployee(String employeeId) {
            log.info("Deleting employee {}", employeeId);
            employeeRepository.deleteById(employeeId);
            return Boolean.TRUE;
        }
    
        private String setEmployeeImageUrl() {
            String[] imageNames = {"face1.png"};
            return ServletUriComponentsBuilder.fromCurrentContextPath().path("/server/image/" + imageNames[new Random().nextInt(1)]).toUriString();
        }
    }
    

    这是我的员工服务界面

    
    import com.example.demo.model.Employee;
    import org.springframework.stereotype.Service;
    
    import java.util.Collection;
    
    @Service
    public interface EmployeeService {
        Employee createEmployee(Employee employee);
        Collection<Employee> listEmployees(int limit);
        Employee getEmployee(String employeeId);
        Employee updateEmployee(Employee employee);
        Boolean deleteEmployee(String employeeId);
    }
    

    这是我的控制器

    
    import com.example.demo.implementation.EmployeeServiceImpl;
    import com.example.demo.model.Employee;
    import com.example.demo.model.Response;
    import jakarta.validation.Valid;
    import lombok.RequiredArgsConstructor;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.Map;
    
    import static java.time.LocalDateTime.now;
    import static java.util.Map.*;
    import static java.util.Map.of;
    import static org.springframework.http.HttpStatus.CREATED;
    import static org.springframework.http.HttpStatus.OK;
    
    @RestController
    @RequestMapping("/employee")
    @RequiredArgsConstructor
    public class EmployeeController {
        private EmployeeServiceImpl employeeService;
    
        // Return the list of employees
        // Return a response entity of OK with a body of
        // builder method of model Response
        // with current timestamp LocalDateTime.now()
        // and then map the data with the key employee and the value returned by listEmployees of employeeService
        // with embeded success message, status, and statusCode. Then build the entire package
        @GetMapping("/list")
        public ResponseEntity<Response> getEmployees() {
            return ResponseEntity.ok(
                    Response.builder()
                            .timestamp(now())
                            .data(of("employees", employeeService.listEmployees(30)))
                            .message("Employee retrieved")
                            .status(OK)
                            .statusCode(OK.value())
                            .build()
            );
        }
    
        // save an employee
        @PostMapping("/save")
        public ResponseEntity<Response> saveEmployee(@RequestBody @Valid Employee employee) {
            return ResponseEntity.ok(
                    Response.builder()
                            .timestamp(now())
                            .data(of("employee", employeeService.createEmployee(employee)))
                            .message("Employee created")
                            .status(CREATED)
                            .statusCode(CREATED.value())
                            .build()
            );
        }
    
        // Return a specific employee with employeeID
        @GetMapping("/getemployee/{employeeId}")
        public ResponseEntity<Response> getEmployee(@PathVariable("employeeId") String employeeId) {
            return ResponseEntity.ok(
                    Response.builder()
                            .timestamp(now())
                            .data(of("employee", employeeService.getEmployee(employeeId)))
                            .message("Employee retrieved")
                            .status(OK)
                            .statusCode(OK.value())
                            .build()
            );
        }
    
        @DeleteMapping("/deleteemployee/{employeeId}")
        public ResponseEntity<Response> deleteEmployee(@PathVariable @Valid String employeeId) {
            return ResponseEntity.ok(
                    Response.builder()
                            .timestamp(now())
                            .data(of("deleted", employeeService.deleteEmployee(employeeId)))
                            .message("Employee deleted")
                            .status(OK)
                            .statusCode(OK.value())
                            .build()
            );
        }
    
    
    }
    

    感谢您的帮助,谢谢!

    1 回复  |  直到 2 年前
        1
  •  1
  •   Tural Ahmadov    2 年前

    问题源于您使用的位置 EmployeeServiceImpl.listEmployees(int) 。可能在其中一个 控制器 类中调用服务方法。

    作为错误的原因,我猜测服务实现没有正确地注入到控制器中的EmployeeService实例中。由于无法正确实例化,因此它为null,引用null对象会导致您提到的NPE。

    解决方案

    • 添加 最终的 关键字到EmployeeService employeeServices;控制器中的线路