Как использовать поиск по идентификатору (первичному ключу) в Spring Controller? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь выполнить поиск по первичному ключу из getOne JpaRepository, передавая ключ

У меня есть модель (клиент), в которой я определил детали клиента. У меня есть интерфейс службы (CustomerService) и его реализация (CustomerServiceImpl, который реализует CustomerService). У меня также есть хранилище интерфейса (CustomerRepository, которое расширяет JpaRepository. Теперь в моем контроллере я передаю идентификатор функции (findCustomerById) и извлекаю клиента с этим идентификатором из хранилища клиентов, используя getOne

в JpaRepository.

Customer customer = customerRepository.getOne (id);

Я продолжаю получать сообщение об ошибке 500 (java.lang.NullPointerException: null. Мой код, кажется, в порядке. В чем может быть проблема? Customer.java

package com.javadevjournal.customer;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="customer")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(name="address")
    private String address;

    public Customer() {
        super();

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

CustomerRepository.java:

package com.javadevjournal.customer;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long>{

}

CustomerController.java:

package com.javadevjournal.customer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;
import com.javadevjournal.customer.CustomerService;

import javax.validation.Valid;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

@RestController
public class CustomerController {

    @Autowired
    private CustomerService  customerService;
    private CustomerRepository customerRepository;

    @GetMapping(path = "/customers")
    public Iterable<Customer> findAll() {
        Iterable<Customer> customers = customerService.findAll();
        return customers;
    }

    // Get a Single Customer
    @GetMapping(path = "/getCustomer/{id}")
    public Customer findCustomerById(@PathVariable("id") Long id) {
        System.out.println("Am going on here...");
        System.out.println("id=="+id);
        System.out.println("fetching customers.."+id);
        Customer customer=customerRepository.getOne(id);
        System.out.println(customer);
        return customer;
    }

    // Create a new Customer
    @PostMapping("/customers")
    public Customer createCustomer(@Valid @RequestBody Customer customer) {
        return customerRepository.save(customer);
    }


}

Я ожидаю получить конкретного клиента на основе идентификатора, передаваемого почтальоном (http://localhost:8080/getCustomer/1), но почтальон выдает мне следующее сообщение об ошибке:

Это приложение не имеет явного сопоставления для / error, поэтому вы видите это как запасной вариант. Вт 25 июня 11:58:47 EAT 2019 Был непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). Нет сообщений доступно исключение java.lang.NullPointerException по адресу com.javadevjournal.customer.CustomerController.findCustomerById (CustomerController.java:43) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.springframework.web.method.support.InvocableHandlerMethod.doInvoke (InvocableHandlerMethod.java:190) в org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest (InvocableHandlerMethod.java:138) в org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle (ServletInvocableHandlerMethod.java:104) в org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod (RequestMappingHandlerAdapter.java:892) в org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal (RequestMappingHandlerAdapter.java:797) в org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle (AbstractHandlerMethodAdapter.java:87) в org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:1039) в org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:942) в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:1005) в org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:897) в javax.servlet.http.HttpServlet.service (HttpServlet.java:634) в org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:882) в javax.servlet.http.HttpServlet.service (HttpServlet.java:741) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:231) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:53) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.springframework.web.filter.RequestContextFilter.doFilterInternal (RequestContextFilter.java:99) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:109) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) вorg.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.springframework.web.filter.FormContentFilter.doFilterInternal (FormContentFilter.java:92) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:109) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal (HiddenHttpMethodFilter.java:93) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:109) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:200) в org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:109) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:193) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:202) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96) в org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:490) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:139) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:92) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:74) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:343) в org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:408) в org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) в org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:853) в org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1587) в org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) at java.lang.Thread.run (Thread.java:745)

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Вы забыли добавить @Autowired на customerRepository

@Autowired
private CustomerService  customerService;
@Autowired
private CustomerRepository customerRepository;
0 голосов
/ 25 июня 2019

Как уже упоминалось выше, вы пропустили аннотацию @Autowired. Также обратите внимание, что рекомендуемый способ проглатывания это бросить конструктор класса или сеттеры

@RestController
public class CustomerController {
    private final CustomerService  customerService;
    private final CustomerRepository customerRepository;

    @Autowire
    public CustomerController(CustomerService  customerService, CustomerRepository customerRepository) {
        customerService = customerService;
        customerRepository = customerRepository;
    }

    // the rest of your code
}

Классная вещь, что этот вид DI работает и без аннотации @Autowired)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...