it-swarm.com.de

Spring Data JPA-Repository wirft einen Nullzeiger

Ich habe mit Spring Data mit Spring Boot gearbeitet. Mit der JavaConfig-Dokumentation habe ich eine Spring-JPA-Konfiguration eingerichtet, aber beim Aufruf der save-Methode in meinem Repository wird ein Nullzeiger ausgelöst. 

Mein Repository:

import org.springframework.data.jpa.repository.JpaRepository;

public interface HouseRepository extends JpaRepository<House, Long> {
}

Meine POJO's:

AbstractHouse

@MappedSuperclass
@Table(name="houses")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class AbstractHouse implements Serializable {

@NotEmpty
private String houseName;

@NotEmpty
private String houseNumber;

Haus

@Entity
public class SmallHouse extends AbstractHouse {

@Id
@GeneratedValue
private Long id;

private Date created;

private Date updated;

Ich habe dann ein Service-Objekt, das ein Autowired-Repository benötigt und versucht, mithilfe von Methoden, die durch JPA abgerufen werden, zu speichern:

@Service
public class HouseService {

@Autowired
protected HouseRepository houseRepository;

public void save(House house) {
    houseRepository.save(house);
} 

Meine Bewerbungsklasse enthält:

@SpringBootApplication
@EnableScheduling
@EnableJpaRepositories
public class Application {

public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
}
}

Ich bin relativ neu bei Spring Data, daher denke ich, dass es etwas in der Konfiguration ist, das ich vermisse. Jeder Rat wäre sehr dankbar!

--Aktualisieren--

Stapelverfolgung:

Java.lang.NullPointerException
    at com.jm.service.HouseService.save(HouseService.Java:15)
    at com.jm.service.HouseClass.gatherHouses(HouseClass.Java:43)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:497)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.Java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.Java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.Java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.Java:775)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.Java:705)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.Java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.Java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.Java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.Java:967)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.Java:858)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.Java:843)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:291)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.Java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:107)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.Java:85)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:107)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:217)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:106)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:142)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:79)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:88)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:518)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1091)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:673)
    at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1500)
    at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1456)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
    at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
    at Java.lang.Thread.run(Thread.Java:745)

Und ich nenne die Methode als solche:

public class HouseMain {

    @Autowired
    public HouseService houseService;

    public void gatherHouse() {
    houseService = new HouseService();
    House h = new House();
    h.setHouseName("House1");
    h.setHouseNumber("12");
    try {

        HouseService.save(vmComp);          
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Dann rufe ich in meinem Controller house.gatherHouse an

6
James Millner

Sie instantiieren HouseService von Hand, nicht durch Spring. In dem von Ihnen erstellten houseService-Objekt befindet sich das Feld HouseRepository houseRepository, das null ist, da Sie es auf keine Weise initialisieren. Wenn Sie Spring und seine Autowired-Funktionalität verwenden, sollten Sie die Instanz von HouseService aus dem Spring-Kontext abrufen. Z.B. Sie können es in Ihre Controller-Klasse @Autowired eingeben.

7
Nikem

Das ist nicht richtig:

 houseService = new HouseService();

da Sie Spring verwenden, sollten Sie Spring erlauben, alle Beans zu erstellen. Aus diesem Grund wird @Autowired verwendet, der in diesem Fall nicht ausgeführt wird und houseRepository initialised als null ist.

1
shankarsh15