I am currently trying to understand the way in which spring creates and destroys beans and how it comes up with the right order to do so.
Lets assume we have three classes
#Component
class Demo1 {
}
#Component
class Demo2{
Demo1 demo1;
// specifically not using #Autowired
public Demo2(Demo1 demo1){
this.demo1 = demo1;
}
public Demo1 getDemo1(){
return this.demo1
}
}
#Component
class Demo3 {
Demo1 demo1
Demo2 demo2;
public Demo3(Demo1 demo1, Demo2 demo2){
this.demo1 = demo1;
this.demo2 = demo2;
}
}
Config class
#Configuration
class MyConfig {
#Bean
public Demo1 demo1(){
return new demo1()
}
#Bean
public Demo2 demo2(){
return new Demo2(demo1());
}
#Bean
public Demo3 demo3(){
Demo2 demo2 = demo2()
return new Demo3(demo2.getDemo1(), demo2);
}
}
I understand that this is not the best/right way to do it but I want to know if its equivalent to using #Autowired annotation and if spring is able to resolve the dependency among the beans while creation, that is create in order
demo1
demo2
demo3
and destroy in order
demo3
demo2
demo1
Does changing the order of the functions in MyConfig make any difference ?
Currently I am facing an error where I believe demo1 is getting destroyed before demo2 or demo3
It doesn't matter if you express configuration in XML, properties (yes that is possible, see https://deinum.biz/2018-04-12-on-spring-applicationcontext-and-bean-creation/), java config or annotations. All of those are bean definitions and the relation between those. Spring will have (some kind) of dependency tree.
Beans are constructed in a certain order and destroyed in the reverse order.
The only "wrong" thing in your code is the demo2.getDemo1() but in this case shouldn't make any difference as Demo3 depends on Demo2 which depends on Demo1`. Ideally you would write the configuration in the following way
Configuration
class MyConfig {
#Bean
public Demo1 demo1(){
return new demo1()
}
#Bean
public Demo2 demo2(Demo1 demo1){
return new Demo2(demo1);
}
#Bean
public Demo3 demo3(Demo2 demo2, Demo1 demo1){
return new Demo3(demo1, demo2);
}
}
This code/config makes it easier for Spring to figure out the interdependencies.
In your case, if you are using Spring Boot and have declared those #Bean methods you will actually end up with multiple instances of the beans.
Running your sample produces, for me the following output (I added #PostConstruct and #PreDestroy methods to the classes).
2022-09-06 09:03:48.366 INFO 64364 --- [ main] b.d.d.DestructionOrderApplication : No active profile set, falling back to 1 default profile: "default"
biz.deinum.destructionorder.DestructionOrderApplication$Demo1#2fb5fe30 - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo1#389562d6 - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo2#5a101b1c - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo2#2160e52a - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo3#29f0802c - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo3#3a60c416 - #PostConstruct
2022-09-06 09:03:48.559 INFO 64364 --- [ main] b.d.d.DestructionOrderApplication : Started DestructionOrderApplication in 0.311 seconds (JVM running for 0.552)
biz.deinum.destructionorder.DestructionOrderApplication$Demo3#3a60c416 - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo3#29f0802c - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo2#2160e52a - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo2#5a101b1c - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo1#389562d6 - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo1#2fb5fe30 - #PreDestroy
In which you can clearly see the #PostConstruct is called in the right order and the #PreDestroy in the reverse order. You can also see you have 2 instances. Removing the #Component leads to the following output:
2022-09-06 09:06:03.520 INFO 64388 --- [ main] b.d.d.DestructionOrderApplication : No active profile set, falling back to 1 default profile: "default"
biz.deinum.destructionorder.DestructionOrderApplication$Demo1#72ab05ed - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo2#27e32fe4 - #PostConstruct
biz.deinum.destructionorder.DestructionOrderApplication$Demo3#c3c4c1c - #PostConstruct
2022-09-06 09:06:03.714 INFO 64388 --- [ main] b.d.d.DestructionOrderApplication : Started DestructionOrderApplication in 0.32 seconds (JVM running for 0.561)
biz.deinum.destructionorder.DestructionOrderApplication$Demo3#c3c4c1c - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo2#27e32fe4 - #PreDestroy
biz.deinum.destructionorder.DestructionOrderApplication$Demo1#72ab05ed - #PreDestroy
My Config class:
#Configuration
public class TimeOutConfig {
#Value("${value1}")
private int value1;
#Value("${value2}")
private int value2;
#Bean()
User boTimeOut() {
System.out.println("In BOTimeOutConfig");
BeanTest b1 = new BeanTest(value1, value2);
User u1 = new User(b1);
return u1;
}
#Value("${value3}")
private int value3;
#Value("${value4}")
private int value4;
#Bean(name = "BSETimeout")
User getBSEUser() {
System.out.println("In BSETimeOutConfig");
User u2 = new User( new BeanTest(value3, value4));
return u2;
}
}
BeanTest Class:
#Component
public class BeanTest {
private int v1;
private int v2;
BeanWebClient b1;
public BeanTest(){}
public BeanTest(int v1, int v2){
this.v1=v1;
this.v2=v2;
beanWebClient();
}
public BeanWebClient beanWebClient() {
//System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+v1+v2);
b1 = new BeanWebClient(v1,v2);
System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+b1.getV1()+" "+b1.getV2());
return b1;
}
public void message()
{
b1.webClientMessage();
//System.out.println("V1= "+v1+" V2= "+v2);
}
}
BeanWebClient Class:
#Component
public class BeanWebClient {
private int v1;
private int v2;
public BeanWebClient(int v1, int v2){
this.v1=v1;
this.v2=v2;
System.out.println("Received from BeanTest "+v1+" "+v2);
}
public BeanWebClient(){
}
public int getV1() {
return v1;
}
public int getV2() {
return v2;
}
public void webClientMessage(){
System.out.println("In BeanWebClient class, printing from autowired dependency "+v1+" "+v2);
}
}
My User class:
#Component
public class User {
#Autowired
private BeanTest beanTest;
public User(BeanTest beanTest){
this.beanTest=beanTest;
}
public void message()
{
beanTest.message();
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
}
Finally, My Service class:
#Service
public class BeanService {
#Autowired
#Qualifier("boTimeOut")
private User boUser;
#Autowired
#Qualifier("BSETimeout")
private User bseUser;
public void printBO()
{
boUser.message();
}
public void printBSE()
{
bseUser.message();
}
}
I was trying to understand how components and autowiring dependencies work in spring boot. In my User class, the autowired BeanTest class is initialized, during configuration- all the necessary print statements are executed. But when I call the functions of the Service class, The autowired User dependency has null for beanTest and its members. As opposed to this, when I just create the BeanTest object in my User class everything works as expected. This is what I mean:
#Component
public class User {
BeanTest beanTest;
public User(BeanTest beanTest){
this.beanTest=beanTest;
}
public void message()
{
beanTest.message();
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
}
I sort of understand that The bean autowired in User class is taken from the container is null. Since Im Autowiring specific User dependency in my service class, I don't understand why it's not working.
Can someone please explain If and How I can autowire the BeanTest class into User class correctly.
Sorry for so many code files.
Outputs
This is the Output I get When I create the BeanTest object manually without #Autowire
In BOTimeOutConfig
Received from BeanTest 10 20
In BeanTest class beanWebClient() method execution v1 and v2: 10 20
In BSETimeOutConfig
Received from BeanTest 30 40
In BeanTest class beanWebClient() method execution v1 and v2: 30 40
2021-11-13 14:37:58.161 WARN 404383 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-13 14:37:58.613 INFO 404383 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-13 14:37:58.622 INFO 404383 --- [ main] c.paytmmoney.errordb.ErrordbApplication : Started ErrordbApplication in 4.04 seconds (JVM running for 4.379)
2021-11-13 14:38:07.768 INFO 404383 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-13 14:38:07.768 INFO 404383 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-13 14:38:07.769 INFO 404383 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
In /test method
In BeanWebClient class, printing from autowired dependency 10 20
In /test method
In BeanWebClient class, printing from autowired dependency 30 40
When I autowire BeanTest Class this is the Output:
In BOTimeOutConfig
Received from BeanTest 10 20
In BeanTest class beanWebClient() method execution v1 and v2: 10 20
In BSETimeOutConfig
Received from BeanTest 30 40
In BeanTest class beanWebClient() method execution v1 and v2: 30 40
2021-11-13 14:40:36.072 WARN 404724 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-13 14:40:36.585 INFO 404724 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-13 14:40:36.596 INFO 404724 --- [ main] c.paytmmoney.errordb.ErrordbApplication : Started ErrordbApplication in 4.353 seconds (JVM running for 4.75)
2021-11-13 14:40:45.081 INFO 404724 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-13 14:40:45.081 INFO 404724 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-13 14:40:45.082 INFO 404724 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
In /test method
2021-11-13 14:40:45.204 ERROR 404724 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at com.paytmmoney.errordb.repository.BeanTest.message(BeanTest.java:42) ~[main/:na]
at com.paytmmoney.errordb.repository.User.message(User.java:22) ~[main/:na]
at com.paytmmoney.errordb.service.BeanService.printBO(BeanService.java:21) ~[main/:na]
I'm using a rest controller to call functions in the Service class.THANK YOU!!!
Given that you are creating BeanTest and User instances on your own in TimeOutConfig, please remove all #Component and #Autowired annotations from BeanTest, BeanWebClient and User as follows:
public class BeanTest {
private int v1;
private int v2;
BeanWebClient b1;
public BeanTest(){}
public BeanTest(int v1, int v2){
this.v1=v1;
this.v2=v2;
beanWebClient();
}
public BeanWebClient beanWebClient() {
//System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+v1+v2);
b1 = new BeanWebClient(v1,v2);
System.out.println("In BeanTest class beanWebClient() method execution v1 and v2: "+b1.getV1()+" "+b1.getV2());
return b1;
}
public void message() {
b1.webClientMessage();
//System.out.println("V1= "+v1+" V2= "+v2);
}
}
public class BeanWebClient {
private int v1;
private int v2;
public BeanWebClient(int v1, int v2) {}
this.v1=v1;
this.v2=v2;
System.out.println("Received from BeanTest "+v1+" "+v2);
}
public BeanWebClient(){ }
public int getV1() {
return v1;
}
public int getV2() {
return v2;
}
public void webClientMessage(){
System.out.println("In BeanWebClient class, printing from autowired dependency "+v1+" "+v2);
}
}
public class User {
private BeanTest beanTest;
public User(BeanTest beanTest) {
this.beanTest=beanTest;
}
public User() {
//System.out.println("user create... hashCode :" + this.hashCode());
}
public void message() {
beanTest.message();
}
}
I am working on Spring project. In this project I have password encoder bean.
#Configuration
public class AppSecurityConfiguration extends WebSecurityConfigurerAdapter {
public AppSecurityConfiguration() {
System.out.println("\n\n " + getClass().getName() + "\n\n\n");
}
#Autowired
private UserService userService;
#Bean
public PasswordEncoder defaultPasswordEncoder() {
System.out.println("\n\n\n bean is created!!!!! \n\n\n");
return new BCryptPasswordEncoder();
}
// other configurations
}
And the class where injection is required is this,
#Component
public class Encoders {
private static PasswordEncoder bCryptPasswordEncoder;
#Autowired
private PasswordEncoder defaultPasswordEncoder;
public Encoders() throws UnsupportedEncodingException {
System.out.println("\n\n\n " + (defaultPasswordEncoder == null) + " \n\n\n"); // this has problem, as defaultPasswordEncoder is null.
Encoders.bCryptPasswordEncoder = defaultPasswordEncoder;
}
// other methods
}
The defaultPasswordEncoder in the above class is null even though I have autowired this field.
The logs are showing that although the appSecurityConfiguration bean was made before encoder bean still the defaultPasswordEncoder bean is being created after encoder bean.
Here is the log,
2021-10-31 10:28:51.644 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'appSecurityConfiguration'
com.clone.postmanc.security.AppSecurityConfiguration$$EnhancerBySpringCGLIB$$9529a353
.
.
.
.
2021-10-31 10:28:51.695 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'encoders'
true // coming from Encoder#Encoder showing that
// defaultPasswordEncoder bean is null
2021-10-31 10:28:51.697 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'defaultPasswordEncoder'
bean is created!!!!! // coming from AppSecurityConfiguration#defaultPasswordEncoder
I have also tried depends on annotation,
#Component
#DependsOn("defaultPasswordEncoder")
public class Encoders {
// rest is same
}
Now in logs defaultPasswordEncoder bean is being created before encoders but still the injection is not happening and the PasswordEncoder defaultPasswordEncoder field is null.
Here is the log,
2021-10-31 10:28:51.644 DEBUG 58508 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'appSecurityConfiguration'
com.clone.postmanc.security.AppSecurityConfiguration$$EnhancerBySpringCGLIB$$9529a353
.
.
.
2021-10-31 10:51:27.323 DEBUG 59592 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'defaultPasswordEncoder'
bean is created!!!!!
2021-10-31 10:51:27.327 DEBUG 59592 --- [ restartedMain] o.s.b.f.s.DefaultListableBeanFactory : Creating shared instance of singleton bean 'encoders'
true // still the field is null.
Can someone tell what is happening? And to resolve this issue?
Use constructor injection instead of property injection
public Encoders(PasswordEncoder defaultPasswordEncoder)
Then the bean will be available in constructor.
everyone. I am new to WebMvcTest, and am learning to write a PostControllerTest. While the project runs well, the test does not work.
2017-05-31 10:08:09.490 INFO 5768 --- [ main] nz.p2.controller.PostControllerTest : Starting PostControllerTest on My-PC with PID 5768 (started by Me in C:\...)
2017-05-31 10:08:09.491 INFO 5768 --- [ main] nz.p2.controller.PostControllerTest : No active profile set, falling back to default profiles: default
2017-05-31 10:08:10.989 INFO 5768 --- [ main] o.s.w.c.s.GenericWebApplicationContext : Refreshing org.springframework.web.context.support.GenericWebApplicationContext#2a8d39c4: startup date [Wed May 31 10:08:10 NZST 2017]; root of context hierarchy
2017-05-31 10:08:12.788 INFO 5768 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2017-05-31 10:08:13.311 WARN 5768 --- [ main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'reCaptchaAuthenticationFilter': Unsatisfied dependency expressed through field 'reCaptchaService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'nz.p2.captcha.ReCaptchaService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
2017-05-31 10:08:13.326 INFO 5768 --- [ main] utoConfigurationReportLoggingInitializer :
Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-05-31 10:08:13.534 ERROR 5768 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Field reCaptchaService in nz.p2.captcha.ReCaptchaAuthenticationFilter required a bean of type 'nz.p2.captcha.ReCaptchaService' that could not be found.
Action:
Consider defining a bean of type 'nz.p2.captcha.ReCaptchaService' in your configuration.
It tells me to do something with the ReCaptchaService; which isn't used with the PostController. Given the simplifed Controller class:
#Controller
public class PostController {
#Autowired
private PostService postService;
#RequestMapping(value = URI_POST_POST, method = RequestMethod.GET)
public ModelAndView get(#Valid Long mkid) throws IOException {
// do somthing here using postService;
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName(URI_POST_POST);
modelAndView.addObject("abc", abc);
return modelAndView;
}
}
The PostControllerTest class is here:
#RunWith(SpringRunner.class)
#WebMvcTest(controllers = PostController.class)
public class PostControllerTest {
private MockMvc mockMvc;
#Autowired
private WebApplicationContext webApplicationContext;
#MockBean
private PostController postControllereMock;
#Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(webApplicationContext).build();
}
#Test
public void testList() throws Exception {
assertThat(this.postControllereMock).isNotNull();
mockMvc.perform(MockMvcRequestBuilders.get(URI_POST_POST + "?mkid=8044022272730561994"))
.andExpect(status().isOk())
.andExpect(content().contentType("text/html;charset=UTF-8"))
.andExpect(view().name(URI_POST_POST))
.andExpect(MockMvcResultMatchers.view().name(URI_POST_POST))
.andExpect(content().string(Matchers.containsString("I have put together some image galleries")))
.andDo(print());
}
}
I have to mention that the reCaptchaService is #Autowired in the ReCaptchaAuthenticationFilter, and the latter one is #Autowired and used here:
#Configuration
#EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
#Override
protected void configure(HttpSecurity http) throws Exception {
http.
// tl; nw
.and().csrf().disable()
.addFilterBefore(reCaptchaAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
// tl; nw
}
}
So, in this case, how can I test the PostController?
I have a problem regarding the proper setup of a H2 database in springboot + hibernate and would very much appreciate your help. I guess my problem is in the #Transaction Annotation, since the respective class throws a NullPointerException. Here is some background information:
The idea of the program (which is not yet finished) is that agents (class "AgentLogic") can calulate prices for specific tasks within a Multi-Agent System. In order to calculate the price, an agent draws parameters from a database. These parameters are needed for some Machine Learning algorithms (in class "MachineLearningSource"), which will calculate the price of the agent.
I would like to setup the configuration of the database WITHOUT using an XML File, similar to the example in http://www.baeldung.com/hibernate-4-spring
The project has the following structure:
Project Structure
UPDATED CODE AFTER INCORPORATING CHANGES FROM #StanislavL
The project is implemented in SpringBoot. Accordingly, I use the following Application class:
package org.schlago.mldb;
import...
#SpringBootApplication
public class Application {
public static void main(String[] args) {
// ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
builder.headless(false);
ConfigurableApplicationContext context = builder.run(args);
}
}
The following class contains the configuration of the database in Spring Hibernate, called DataBaseConfig:
package org.schlago.mldb.database;
import...
#Configuration
#Profile("param_db")
#EnableTransactionManagement
#ComponentScan({"org.schlago.mldb.mapping","org.schlago.mldb.machineLearning"})
public class DatabaseConfig {
#Autowired
private Environment env;
#Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("datasource.driver"));
dataSource.setUrl(env.getProperty("datasource.url"));
dataSource.setUsername(env.getProperty("datasource.username"));
dataSource.setPassword(env.getProperty("datasource.password"));
return dataSource;
}
#Bean
public LocalSessionFactoryBean sessionFactory(){
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", env.getProperty("jpa.hibernate.dialect"));
hibernateProperties.put("hibernate.show_sql", env.getProperty("jpa.hibernate.show-sql"));
hibernateProperties.put("hibernate.hbm2ddl.auto", env.getProperty("jpa.hibernate.hbm2ddl.auto"));
hibernateProperties.put("spring.jpa.hibernate.ddl-auto", env.getProperty("jpa.hibernate.ddl-auto"));
sessionFactoryBean.setHibernateProperties(hibernateProperties);
return sessionFactoryBean;
}
#Bean
#Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory);
return transactionManager;
}
#Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
This configuration uses the following environment (#Profile) in order to setup the sessionFactoryBean, called appliation.yaml:
spring.profiles: param_db
datasource:
driver: org.h2.Driver
url: jdbc:h2:tcp://localhost/~/test
username: sa
password:
jpa:
hibernate.show-sql: true
hibernate.hbm2ddl.auto: none
hibernate.dialect: org.hibernate.dialect.H2Dialect
hibernate.ddl-auto: validate
hibernate.globally_quoted_identifiers: true
entitymanager:
packagesToScan: org.schlago.mldb.mapping
Parameters shall be inserted to the database via a DAO, using a #Transactional Annotation. This DAO is called ParametersDao:
package org.schlago.mldb.mapping;
import ...
#Transactional
public class ParametersDao {
#Autowired
private SessionFactory _sessionFactory;
private Session getSession() {
return _sessionFactory.getCurrentSession();
}
public void save(Parameters parameters) { getSession().save(parameters); }
public void update(Parameters parameters) {
getSession().update(parameters);
}
public List<Parameters> getAllParameters() {
return getSession().createQuery("from Parameters").list();
}
public Parameters getParameterById(int id) {
List<Parameters> parametersList = getSession()
.createQuery("from Parameters where paramId = :theId")
.setParameter("theId", id).list();
if (parametersList.size() == 0) {
return null;
}
return parametersList.get(0);
}
}
Parameters are specified via the Paramters class:
package org.schlago.mldb.mapping;
#Entity
#Table(name = "mlparam")
public class Parameters {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private long paramId;
#Column(name = "name")
private String name;
#Column(name = "value")
private double value;
#Column(name = "timestamp")
private Date timestamp;
public Parameters(){
}
public long getParamId() {
return paramId;
}
public void setParamId(int paramId) {
this.paramId = paramId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) { this.timestamp = timestamp; }
}
I think there is an error in the way ParametersDao is setup. However, for your better understanding, here are the other classes used within this project. The following class is AgentLogic, which will calculate a price upon request in a later strange of the code. Since the code is still in an early stage, I used #PostConstruct rather than a request, in order to test if the price calulation works:
package org.schlago.mldb.logic;
import...
#Component
public class AgentLogic {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
#Autowired
private MachineLearningSource machineLearningSource;
#PostConstruct
public void init(){
int priceInCent = 50;
priceInCent = machineLearningSource.getPrice(getAgent());
LOGGER.info("Answered with offer about " + priceInCent + " Cents.");
}
// DUMMY class: Return a new agent
public static Agent getAgent(){
// Currently, an Agent is just an (empty) dummy class
Agent agent = new Agent();
return agent;
}
}
Finally, the following class is responsible for price calcuation. Since the code is still in an early stage, price calculation is set randomly, rather than implementing machinelearning algorithms. In the method getParameters(), some Parameters are inserted to the dataBase for testing purposes:
package org.schlago.mldb.machineLearning;
import org.schlago.mldb.Nodes.Agent;
import org.schlago.mldb.mapping.Parameters;
import org.schlago.mldb.mapping.ParametersDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
#Component
public class MachineLearningSource {
#Autowired
ParametersDao parametersDao;
private static final Logger LOGGER = LoggerFactory.getLogger(MachineLearningSource.class);
public int getPrice(Agent agent) {
Random r = new Random();
int thePrice = r.nextInt(99) + 1;
LOGGER.info("The price is dynamically calculated right now!");
HashMap<String, Double> parameters = getParameters();
return thePrice;
}
public HashMap<String, Double> getParameters() {
HashMap<String, Double> equationParameters = new HashMap<>();
// TEST: Since database is currently empty, parameters are inserted manually here (this will change later)
LOGGER.info("About to insert into table");
Parameters myCalcParams = new Parameters();
myCalcParams.setName("kappa");
myCalcParams.setValue(2.39583992);
myCalcParams.setTimestamp(new Date());
parametersDao.save(myCalcParams);
LOGGER.info("Successfully inserted parameters");
/*
// Get the parameters via parametersDao, work in progress!
List<Parameters> parameters = parametersDao.getAllParameters();
Parameters myParam = parametersDao.getParameterById(3748);
if (myParam == null) {
LOGGER.info("Dataset does not exist!");
}
for (Parameters param : parameters) {
equationParameters.put(param.getName(), param.getValue());
LOGGER.info("Actual parameter for price calculation: " + param.getName());
LOGGER.info("Value: " + param.getValue());
}
*/
// TEST: Return dummy equationParameters
equationParameters.put("a", 2.48238948239);
equationParameters.put("b", 8.23482489729);
return equationParameters;
}
}
UPDATED ERROR STATEMENT
Unfortuntely, I still get an error:
2017-02-03 14:41:39.005 INFO 7416 --- [ main] org.schlago.mldb.Application : Starting Application on mobile-97 with PID 7416 (C:\Users\Jan\Documents\Masterarbeit\12_MLDBtest\target\classes started by Jan in C:\Users\Jan\Documents\Masterarbeit\12_MLDBtest)
2017-02-03 14:41:39.005 INFO 7416 --- [ main] org.schlago.mldb.Application : The following profiles are active: param_db
2017-02-03 14:41:39.083 INFO 7416 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext#79ca92b9: startup date [Fri Feb 03 14:41:39 CET 2017]; root of context hierarchy
2017-02-03 14:41:40.581 INFO 7416 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'databaseConfig' of type [class org.schlago.mldb.database.DatabaseConfig$$EnhancerBySpringCGLIB$$829d3967] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-02-03 14:41:40.721 INFO 7416 --- [ main] o.s.j.d.DriverManagerDataSource : Loaded JDBC driver: org.h2.Driver
2017-02-03 14:41:41.004 INFO 7416 --- [ main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2017-02-03 14:41:41.020 INFO 7416 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2017-02-03 14:41:41.129 INFO 7416 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {4.3.11.Final}
2017-02-03 14:41:41.129 INFO 7416 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
2017-02-03 14:41:41.129 INFO 7416 --- [ main] org.hibernate.cfg.Environment : HHH000021: Bytecode provider name : javassist
2017-02-03 14:41:41.394 INFO 7416 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
2017-02-03 14:41:41.521 INFO 7416 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2017-02-03 14:41:41.693 INFO 7416 --- [ main] o.h.h.i.ast.ASTQueryTranslatorFactory : HHH000397: Using ASTQueryTranslatorFactory
2017-02-03 14:41:42.363 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export
2017-02-03 14:41:42.432 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete
2017-02-03 14:41:42.510 WARN 7416 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'agentLogic': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.schlago.mldb.machineLearning.MachineLearningSource org.schlago.mldb.logic.AgentLogic.machineLearningSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
2017-02-03 14:41:42.510 INFO 7416 --- [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2017-02-03 14:41:42.510 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000227: Running hbm2ddl schema export
2017-02-03 14:41:42.559 INFO 7416 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : HHH000230: Schema export complete
2017-02-03 14:41:42.559 ERROR 7416 --- [ main] o.s.boot.SpringApplication : Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'agentLogic': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.schlago.mldb.machineLearning.MachineLearningSource org.schlago.mldb.logic.AgentLogic.machineLearningSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.schlago.mldb.machineLearning.MachineLearningSource org.schlago.mldb.logic.AgentLogic.machineLearningSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'machineLearningSource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {#org.springframework.beans.factory.annotation.Autowired(required=true)}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.schlago.mldb.mapping.ParametersDao org.schlago.mldb.machineLearning.MachineLearningSource.parametersDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.schlago.mldb.mapping.ParametersDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations:
2017-02-03 14:41:42.575 INFO 7416 --- [ main] .b.l.ClasspathLoggingApplicationListener : Application failed to start with classpath: [file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/charsets.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/deploy.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/access-bridge-64.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/cldrdata.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/dnsns.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/jaccess.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/jfxrt.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/localedata.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/nashorn.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunec.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunjce_provider.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunmscapi.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/sunpkcs11.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/ext/zipfs.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/javaws.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jce.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jfr.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jfxswt.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/jsse.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/management-agent.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/plugin.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/resources.jar, file:/C:/Program%20Files/Java/jdk1.8.0_60/jre/lib/rt.jar, file:/C:/Users/Jan/Documents/Masterarbeit/12_MLDBtest/target/classes/, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-data-jpa/1.3.5.RELEASE/spring-boot-starter-data-jpa-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter/1.3.5.RELEASE/spring-boot-starter-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot/1.3.5.RELEASE/spring-boot-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.3.5.RELEASE/spring-boot-autoconfigure-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-logging/1.3.5.RELEASE/spring-boot-starter-logging-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7.jar, file:/C:/Users/Jan/.m2/repository/ch/qos/logback/logback-core/1.1.7/logback-core-1.1.7.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/jul-to-slf4j/1.7.21/jul-to-slf4j-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.21/log4j-over-slf4j-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-core/4.2.6.RELEASE/spring-core-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/yaml/snakeyaml/1.16/snakeyaml-1.16.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-aop/1.3.5.RELEASE/spring-boot-starter-aop-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-aop/4.2.6.RELEASE/spring-aop-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar, file:/C:/Users/Jan/.m2/repository/org/aspectj/aspectjweaver/1.8.9/aspectjweaver-1.8.9.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/1.3.5.RELEASE/spring-boot-starter-jdbc-1.3.5.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/apache/tomcat/tomcat-jdbc/8.0.33/tomcat-jdbc-8.0.33.jar, file:/C:/Users/Jan/.m2/repository/org/apache/tomcat/tomcat-juli/8.0.33/tomcat-juli-8.0.33.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-jdbc/4.2.6.RELEASE/spring-jdbc-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/hibernate-entitymanager/4.3.11.Final/hibernate-entitymanager-4.3.11.Final.jar, file:/C:/Users/Jan/.m2/repository/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar, file:/C:/Users/Jan/.m2/repository/org/jboss/logging/jboss-logging-annotations/1.2.0.Beta1/jboss-logging-annotations-1.2.0.Beta1.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/hibernate-core/4.3.11.Final/hibernate-core-4.3.11.Final.jar, file:/C:/Users/Jan/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar, file:/C:/Users/Jan/.m2/repository/org/jboss/jandex/1.1.0.Final/jandex-1.1.0.Final.jar, file:/C:/Users/Jan/.m2/repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar, file:/C:/Users/Jan/.m2/repository/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/common/hibernate-commons-annotations/4.0.5.Final/hibernate-commons-annotations-4.0.5.Final.jar, file:/C:/Users/Jan/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.1-api/1.0.0.Final/hibernate-jpa-2.1-api-1.0.0.Final.jar, file:/C:/Users/Jan/.m2/repository/org/javassist/javassist/3.18.1-GA/javassist-3.18.1-GA.jar, file:/C:/Users/Jan/.m2/repository/javax/transaction/javax.transaction-api/1.2/javax.transaction-api-1.2.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/data/spring-data-jpa/1.9.4.RELEASE/spring-data-jpa-1.9.4.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/data/spring-data-commons/1.11.4.RELEASE/spring-data-commons-1.11.4.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-orm/4.2.6.RELEASE/spring-orm-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-context/4.2.6.RELEASE/spring-context-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-expression/4.2.6.RELEASE/spring-expression-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-tx/4.2.6.RELEASE/spring-tx-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-beans/4.2.6.RELEASE/spring-beans-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/jcl-over-slf4j/1.7.21/jcl-over-slf4j-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/springframework/spring-aspects/4.2.6.RELEASE/spring-aspects-4.2.6.RELEASE.jar, file:/C:/Users/Jan/.m2/repository/com/sparkjava/spark-core/1.1.1/spark-core-1.1.1.jar, file:/C:/Users/Jan/.m2/repository/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-server/9.2.16.v20160414/jetty-server-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-http/9.2.16.v20160414/jetty-http-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-util/9.2.16.v20160414/jetty-util-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-io/9.2.16.v20160414/jetty-io-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-webapp/9.2.16.v20160414/jetty-webapp-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-xml/9.2.16.v20160414/jetty-xml-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-servlet/9.2.16.v20160414/jetty-servlet-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/org/eclipse/jetty/jetty-security/9.2.16.v20160414/jetty-security-9.2.16.v20160414.jar, file:/C:/Users/Jan/.m2/repository/net/sf/xenqtt/xenqtt/0.9.7/xenqtt-0.9.7.jar, file:/C:/Users/Jan/.m2/repository/org/json/json/20151123/json-20151123.jar, file:/C:/Users/Jan/.m2/repository/com/pi4j/pi4j-core/1.0/pi4j-core-1.0.jar, file:/C:/Users/Jan/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.54/bcprov-jdk15on-1.54.jar, file:/C:/Users/Jan/.m2/repository/org/bouncycastle/bcpkix-jdk15on/1.54/bcpkix-jdk15on-1.54.jar, file:/C:/Users/Jan/.m2/repository/com/h2database/h2/1.4.192/h2-1.4.192.jar, file:/C:/Users/Jan/.m2/repository/org/opcfoundation/ua/1.02.337.10/ua-1.02.337.10.jar, file:/C:/Users/Jan/.m2/repository/com/prosys/ua/server-client-sdk/2.2/server-client-sdk-2.2.jar, file:/C:/Program%20Files%20(x86)/JetBrains/IntelliJ%20IDEA%202016.2.5/lib/idea_rt.jar]
Try to add #Component annotation to the MachineLearningSource service class and check both dao and the service are included in the #ComponentScan
UPDATE
In the AgentLogic you manually create the machineLearningSource
MachineLearningSource machineLearningSource = new MachineLearningSource();
priceInCent = machineLearningSource.getPrice(getAgent());
Instead add
#Autowired
private MachineLearningSource machineLearningSource;
To the class to let Spring initialize this properly. Or you can autowire dao in the class and manually call
machineLearningSource.setDao(theAutowiredDao);
UPDATE2:
Now the dao is not marked to be detected as a spring bean. Add #Repository annotation to the DAO.
UPDATE3:
sessionFactoryBean.setPackagesToScan(env.getProperty("entitymanager.packagesToScan"));
check which exactly packages are scanned there. Need to have all packages where your entity classes are stored.