2016-05-25 6 views
3

Ich habe mit Spring Data mit Spring Boot gearbeitet. Mit der JavaConfig-Dokumentation habe ich eine Spring-JPA-Konfiguration eingerichtet, aber beim Aufruf der Speichermethode in meinem Repository wird ein Nullzeiger geworfen.Spring Data JPA-Repository wirft Nullzeiger

Mein Repository:

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

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

Mein POJO ist:

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 Dienstobjekt bekam, die eine Autowired Repo nimmt sitory und versucht, unter Verwendung von Verfahren erhalten durch JPA zu speichern:

@Service 
public class HouseService { 

@Autowired 
protected HouseRepository houseRepository; 

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

Meine Anwendungsklasse enthält:

@SpringBootApplication 
@EnableScheduling 
@EnableJpaRepositories 
public class Application { 

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

ich Spring Data ziemlich neu bin, so dass ich denke, es ist etwas in der Konfiguration, die ich bin Vermissen, jeder Rat würde sehr geschätzt werden!

--Update--

Stack Trace:

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 die Methode als solche bezeichnen:

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(); 
    } 
} 
} 

Da ist in meinem Controller Ich rufe house.gatherHouse

+0

Zeigen Sie uns den exakten Stacktrace Ihrer Exception. Und wie nennst du deine 'HouseService.save' Methode? – Nikem

+0

Redigierte den Beitrag jetzt. –

+0

Bitte geben Sie uns den Code, der zumindest kompiliert. Sie verwenden "h", bevor Sie es deklarieren, "vmComp" ist nicht deklariert ... – Nikem

Antwort

2

Sie instanziieren derzeit HouseService von Hand, nicht durch den Frühling. Im Objekt houseService, das Sie erstellt haben, haben Sie das Feld HouseRepository houseRepository, das null ist, weil Sie es in keiner Weise initialisieren. Wenn Sie Spring und seine Autowired-Funktionalität verwenden, sollten Sie die Instanz von HouseService aus Spring-Kontext abrufen. Z.B. Sie können @Autowired es in Ihre Controller-Klasse.

+0

Dies ist, wo ich denke, ich bin verwirrt. Ich habe den Dienst kommentiert, von dem ich glaubte, dass er ihn mit dem Anwendungskontext eingerichtet hat. Wenn ich den houseService = new HouseService() raushole; Der Null-Zeiger geht dann auf die HouseService-Klasse, was wiederum darauf hinausläuft, den Kontext zu definieren. –

+0

Nein, nur das Kommentieren des Servers erstellt oder startet den Spring-Kontext nicht automatisch. Bitte konsultieren Sie Spring Dokumente, wie man das macht. – Nikem

+0

Nach dem Anschauen: https://spring.io/guides/gs/spring-boot/ Ich habe einen Code hinzugefügt, um alle registrierten Beans ausgeben, und ich kann eine HouseRepository & HouseService-Bean im Anwendungskontext sehen. Es scheint also, dass sie korrekt registriert wurden, aber ich kann sie nicht in meinen Klassen erreichen. –

1

Dies ist nicht korrekt:

houseService = new HouseService(); 

da Sie Spring verwenden, sollten Sie Frühling erlauben alle die Bohnen zu schaffen, das ist der Grund, @Autowired zu verwenden, die in diesem Fall nicht ausgeführt zu werden und houseRepository ist initialised als null.

Verwandte Themen