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
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.
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
.