web-dev-qa-db-fra.com

Le référentiel JPA Spring Data lève le pointeur null

Je travaille avec Spring Data avec Spring Boot. Avec la documentation JavaConfig, j'ai configuré une configuration Spring JPA, mais lors de l'appel de la méthode de sauvegarde dans mon référentiel, un pointeur null est généré. 

Mon référentiel:

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

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

Mes 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;

Maison

@Entity
public class SmallHouse extends AbstractHouse {

@Id
@GeneratedValue
private Long id;

private Date created;

private Date updated;

J'ai ensuite un objet de service qui utilise un référentiel Autowired et tente de sauvegarder à l'aide de méthodes obtenues via JPA:

@Service
public class HouseService {

@Autowired
protected HouseRepository houseRepository;

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

Ma classe d'application contient:

@SpringBootApplication
@EnableScheduling
@EnableJpaRepositories
public class Application {

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

Je suis assez nouveau dans Spring Data, je pense donc que c'est quelque chose dans la configuration qui me manque, tout conseil serait grandement apprécié!

--Mettre à jour--

Trace de la pile:

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)

Et j'appelle la méthode en tant que telle:

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

Ensuite, dans mon contrôleur, j'appelle house.gatherHouse

6
James Millner

Vous instanciez actuellement HouseService manuellement, et non via Spring. Dans l'objet houseService que vous avez créé, vous avez le champ HouseRepository houseRepository qui est null, car vous ne l'initialisez en aucune façon. Si vous utilisez Spring et sa fonctionnalité Autowired, vous devriez obtenir l'instance de HouseService à partir du contexte Spring. Par exemple. vous pouvez @Autowired dans votre classe de contrôleur.

7
Nikem

Ce n'est pas correct:

 houseService = new HouseService();

étant donné que vous utilisez Spring, vous devez autoriser Spring à créer tous les beans. C’est la raison de l’utilisation de @Autowired, qui dans ce cas n’est pas exécuté et houseRepository est initialised comme null.

1
shankarsh15