Search code examples
springservicecontrollerdaodto

Error creating bean with name 'activityController'


I'm having this problem while running on Server (Tomcat) my project. I have created a Maven project using Spring. The Java version is Java 1.8. NO SPRING-BOOT!

Error creating bean with name 'activityController': Unsatisfied dependency expressed through field 'activityService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'activityService': Unsatisfied dependency expressed through field 'dao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.calendar.repository.ActivityDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Could you please help me? Thank you!

This is the code. Thank you!!!

pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.calendar</groupId>
    <artifactId>calendar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>Calendar</name>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <springframework.version>5.1.4.RELEASE</springframework.version>
        <jackson.version>2.11.2</jackson.version>
        <email.version>1.6.2</email.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.1.Final</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.0</version>
        </dependency>
    </dependencies>

    <repositories>
    </repositories>

    <build>
        <finalName>company-calendar</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Activity.java

package com.calendar.entity;

import java.io.Serializable;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;

/**
 * The persistent class for the activity database table.
 *
 */
@Entity
@NamedQuery(name = "Activity.findAll", query = "SELECT a FROM Activity a")
public class Activity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    @Column(name = "create_time")
    private Timestamp createTime;

    @Column(name = "created_by")
    private String createdBy;

    private String description;

    @Column(name = "update_time")
    private Timestamp updateTime;

    @Column(name = "updated_by")
    private String updatedBy;

    //bi-directional many-to-one association to CalendarHeader
    @OneToMany(mappedBy = "activity")
    private List<CalendarHeader> calendarHeaders;

    public Activity() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Timestamp getCreateTime() {
        return this.createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public String getCreatedBy() {
        return this.createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Timestamp getUpdateTime() {
        return this.updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdatedBy() {
        return this.updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }

    public List<CalendarHeader> getCalendarHeaders() {
        return this.calendarHeaders;
    }

    public void setCalendarHeaders(List<CalendarHeader> calendarHeaders) {
        this.calendarHeaders = calendarHeaders;
    }

    public CalendarHeader addCalendarHeader(CalendarHeader calendarHeader) {
        getCalendarHeaders().add(calendarHeader);
        calendarHeader.setActivity(this);

        return calendarHeader;
    }

    public CalendarHeader removeCalendarHeader(CalendarHeader calendarHeader) {
        getCalendarHeaders().remove(calendarHeader);
        calendarHeader.setActivity(null);

        return calendarHeader;
    }

}

ActivityDAO.java

    package com.calendar.repository;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    import com.calendar.entity.Activity;
    
    
    @Repository
    public interface ActivityDAO extends JpaRepository<Activity, Integer> {}


**ActivityDTO.java**

package com.calendar.dto;

import java.sql.Timestamp;

public class ActivityDTO {

    private Integer id;

    private String description;
    
    private Timestamp createTime;

    private String createdBy;
    
    private Timestamp updateTime;

    private String updatedBy;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public Timestamp getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
    
    

}

ActivityService.java

package com.calendar.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.calendar.dto.ActivityDTO;
import com.calendar.repository.ActivityDAO;
import com.calendar.entity.Activity;

@Service
public class ActivityService {
    
    @Autowired
    ActivityDAO dao;
    
    public List<ActivityDTO> findAll() {
        List<ActivityDTO> DTOList = new ArrayList<ActivityDTO>();
        List<Activity> entity = dao.findAll();
        if (entity != null) {
            for (Activity e : entity) {
                DTOList.add(getDTOFromEntity(e));
            }
        }
        return DTOList;
    };

        
    
    protected ActivityDTO getDTOFromEntity(Activity entity) {
        ActivityDTO activityDTO = new ActivityDTO();
        
        activityDTO.setId(entity.getId());
        activityDTO.setDescription(entity.getDescription());
        activityDTO.setCreatedBy(entity.getCreatedBy());
        activityDTO.setCreateTime(entity.getCreateTime());
        activityDTO.setUpdatedBy(entity.getUpdatedBy());
        activityDTO.setUpdateTime(entity.getUpdateTime());
        
        return activityDTO;
    }

}

ActivityController.java

package com.calendar.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.calendar.dto.ActivityDTO;
import com.calendar.service.ActivityService;

@RestController
@RequestMapping("activity")
public class ActivityController {
    
    
    @Autowired
    private ActivityService activityService;
    
    private ActivityService getService() {
        System.out.println("service= " + activityService);
        return activityService;
    }
    
    @Transactional(readOnly = true)
    @GetMapping("")
    @ResponseBody
    public List<ActivityDTO> findAll() {
        System.out.println("SIL findAll");
        return getService().findAll();
    }

}

AppConfig.java

package com.calendar.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = "com.calendar")
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        //to see html files
        configurer.enable();
    }

    //Entity manager
    @Bean(name = "Calendar_PU")
    public LocalEntityManagerFactoryBean getEntityManagerFactoryBean() {
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("Calendar_PU");
        return factoryBean;
    }
}

Regards, Francesco


Solution

  • Try adding @EnableJpaRepositories to your AppConfig:

    @Configuration
    @EnableWebMvc
    @EnableTransactionManagement
    @EnableJpaRepositories(basePackages = "com.calendar.repository")
    @ComponentScan(basePackages = "com.calendar")
    public class AppConfig implements WebMvcConfigurer {
    
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            //to see html files
            configurer.enable();
        }
    
        //Entity manager
        @Bean(name = "Calendar_PU")
        public LocalEntityManagerFactoryBean getEntityManagerFactoryBean() {
            LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
            factoryBean.setPersistenceUnitName("Calendar_PU");
            return factoryBean;
        }
    }
    

    You also need to change your pom.xml. There are too many dependencies (most of them are already part of spring-data-jpa) and spring-data-jpa requires Spring 5.3.5.

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.calendar</groupId>
    <artifactId>calendar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    
    <name>Calendar</name>
    
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <springframework.version>5.3.5</springframework.version>
        <jackson.version>2.11.2</jackson.version>
        <email.version>1.6.2</email.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.0</version>
        </dependency>
    </dependencies>
    
    <repositories>
    </repositories>
    
    <build>
        <finalName>company-calendar</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    </project>
    

    This is why you should consider using Spring Boot. You will avoid issues with dependencies that do not work together.