Stoian Delev
Stoian Delev

Reputation: 1

Issue launching the Docker with Spring-boot and MySQL

I create a spring app with the database MySQL. When I run normally is works fine. But I want to use docker for the app.

When I launch the spring-boot application I receive this error:

09:53:56.898 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webConfigurationInterceptor' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/config/WebConfigurationInterceptor.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlackListInterceptor' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/web/interceptors/IpBlackListInterceptor.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlockedAddressesServiceImpl' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/service/impl/IpBlockedAddressesServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.favouritePlaceInTheWorld.repository.IpBlockedAddressesRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
09:53:56.931 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webConfigurationInterceptor' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/config/WebConfigurationInterceptor.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlackListInterceptor' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/web/interceptors/IpBlackListInterceptor.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlockedAddressesServiceImpl' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/service/impl/IpBlockedAddressesServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.favouritePlaceInTheWorld.repository.IpBlockedAddressesRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301)
        at com.example.favouritePlaceInTheWorld.FavouritePlaceApplication.main(FavouritePlaceApplication.java:12)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlackListInterceptor' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/web/interceptors/IpBlackListInterceptor.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlockedAddressesServiceImpl' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/service/impl/IpBlockedAddressesServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.favouritePlaceInTheWorld.repository.IpBlockedAddressesRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
        ... 18 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ipBlockedAddressesServiceImpl' defined in URL [jar:file:/app.jar!/com/example/favouritePlaceInTheWorld/service/impl/IpBlockedAddressesServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.favouritePlaceInTheWorld.repository.IpBlockedAddressesRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
        ... 32 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.favouritePlaceInTheWorld.repository.IpBlockedAddressesRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1799)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1355)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
        ... 46 common frames omitted

This is my Dockerfile:

FROM openjdk:17
ADD target/School.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

My Application.yml

spring:
    datasource:
        driverClassName: com.mysql.cj.jdbc.Driver
        username: root
        password: 12345678
        url: jdbc:mysql://localhost:3306/favourite_place_in_the_world?useSSL=false&createDatabaseIfNotExist=true
    jpa:
        hibernate:
            ddl-auto: update
        open-in-view: false
        properties:
            hibernate:
                dialect: org.hibernate.dialect.MySQL8Dialect
                format_sql: true
    mvc:
        hiddenmethod:
            filter:
                enabled: true

#this is for mailHog SMTP server test
mail:
    host: "localhost"
    port: 1025
    username: ${mailHog_username}
    password: ${mailHog_password}

#this is for check the time AOP SLO in MilliSeconds 1000 ms = 1s
#ex -> 60 for local. 500 for remote
slos-config:
    slos:
        -
            id: local_operation
            threshold: 60
        -
            id: remote_operation
            threshold: 5

#for actuator endpoint
management:
    server:
        port: 8081
    metrics:
        enabled: true
        export:
            prometheus:
                enabled: true
    endpoint:
        web:
            base-path: /actuator
        prometheus:
            enabled: true
    endpoints:
        jmx:
            exposure:
                include: "*"
        web:
            exposure:
                include: "*"
    info:
        env:
            enabled: true

#for grafana and prometheus
global:
    scrape_interval: 5s
    evaluation_interval: 15s

scrape_configs:
    - job_name: 'prometheus'

      honor_labels: true

      metric_path: /actuator/prometheus
      scheme: http

      static_configs:
          - targets: ['localhost:8080']


# data_source=jdbc:mysql://localhost:3306/favourite_place_in_the_world?useSSL\=false&createDatabaseIfNotExist\=true
# [email protected]

My pom.xml file

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>School</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>School</name>
    <description>School</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>5.7.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.5.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.20</version>
        </dependency>

        <!--        for configuration in SLO config-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.7.0</version>
            <optional>true</optional>
        </dependency>

        <!--for test -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <version>5.5.2</version>
            <scope>test</scope>
        </dependency>

        <!--for test -->
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>2.4.1</version>
            <scope>test</scope>
        </dependency>

        <!--for actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.6.3</version>
        </dependency>


        <!--for prometheus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.8.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>




Also i connect docker container with mysql with 
create network
docker network create spring-net
docker network connect spring-net mysqldb

I check is work find with - docker container inspect mysqldb

But when i start with - 
 docker run -p 9000:8080 --name app --net spring-net -e MYSQL_HOST=mysqldb -e MYSQL_USER=root -e MYSQL_PASSWORD=12345678 -e MYSQL_PORT=3306 app
 is generate this issue.



This is my configuration file:

@Configuration
public class WebConfigurationInterceptor implements WebMvcConfigurer {

    private final StatsInterceptor statsInterceptor;
    private final IpBlackListInterceptor ipBlackListInterceptor;
    private final MaintenanceInterceptor maintenanceInterceptor;

    public WebConfigurationInterceptor(StatsInterceptor statsInterceptor,
                                       IpBlackListInterceptor ipBlackListInterceptor,
                                       MaintenanceInterceptor maintenanceInterceptor) {
        this.statsInterceptor = statsInterceptor;
        this.ipBlackListInterceptor = ipBlackListInterceptor;
        this.maintenanceInterceptor = maintenanceInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(statsInterceptor);
        registry.addInterceptor(ipBlackListInterceptor);
        registry.addInterceptor(maintenanceInterceptor);
    }
}


Entity for class

@Entity
@Table(name = "ip_blocked_address")
public class IpBlockedAddress extends BaseEntity{

    private String name;

    public IpBlockedAddress() {
    }

    public String getName() {
        return name;
    }

    public IpBlockedAddress setName(String name) {
        this.name = name;
        return this;
    }
}

Service for model entity

public class IpBlockedAddressServiceModel {

    @NotBlank
    @Size(min = 10)
    private String textContent;

    public IpBlockedAddressServiceModel() {
    }

    public String getTextContent() {
        return textContent;
    }

    public IpBlockedAddressServiceModel setTextContent(String textContent) {
        this.textContent = textContent;
        return this;
    }
}


Repository

@Repository
public interface IpBlockedAddressesRepository extends JpaRepository<IpBlockedAddress, Long> {

    Optional<IpBlockedAddress> findByName(String name);
}

Interface:

public interface IpBlockedAddressesService {

    IpBlockedAddress findByName(String name);

    void addBlockedIpToDB(IpBlockedAddressServiceModel ipBlockedAddressServiceModel);
}


Implementation of Interface

package com.example.favouritePlaceInTheWorld.service.impl;

import com.example.favouritePlaceInTheWorld.model.entity.IpBlockedAddress;
import com.example.favouritePlaceInTheWorld.model.service.IpBlockedAddressServiceModel;
import com.example.favouritePlaceInTheWorld.repository.IpBlockedAddressesRepository;
import com.example.favouritePlaceInTheWorld.service.IpBlockedAddressesService;
import org.springframework.stereotype.Service;

@Service
public class IpBlockedAddressesServiceImpl implements IpBlockedAddressesService {

    private final IpBlockedAddressesRepository ipBlockedAddressesRepository;

    public IpBlockedAddressesServiceImpl(IpBlockedAddressesRepository ipBlockedAddressesRepository) {
        this.ipBlockedAddressesRepository = ipBlockedAddressesRepository;
    }

    @Override
    public IpBlockedAddress findByName(String name) {
        return ipBlockedAddressesRepository
                .findByName(name)
                .orElse(null);
    }

    @Override
    public void addBlockedIpToDB(IpBlockedAddressServiceModel ipBlockedAddressServiceModel) {
        IpBlockedAddress ipBlockedAddress = new IpBlockedAddress();

        ipBlockedAddress.setName(ipBlockedAddressServiceModel.getTextContent());

        ipBlockedAddressesRepository.save(ipBlockedAddress);
    }
}


And Interceptor

package com.example.favouritePlaceInTheWorld.web.interceptors;

import com.example.favouritePlaceInTheWorld.model.entity.IpBlockedAddress;
import com.example.favouritePlaceInTheWorld.service.IpBlockedAddressesService;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class IpBlackListInterceptor implements HandlerInterceptor {


    private final IpBlockedAddressesService ipBlockedAddressesService;

    public IpBlackListInterceptor(IpBlockedAddressesService ipBlockedAddressesService) {
        this.ipBlockedAddressesService = ipBlockedAddressesService;
    }

    /**
     * this is method from HandlerInterceptor interface
     * request is have method getRemoteAddr()
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        IpBlockedAddress blockedIp = ipBlockedAddressesService.findByName(ipAddress);
        return blockedIp == null;
    }
}

Upvotes: 0

Views: 398

Answers (1)

Loading
Loading

Reputation: 1110

docker url of your db connection needs to be changed:

inside a docker container, the url should be (if you start it with docker-compose and the service of mysql is called "mysql"):

jdbc:mysql://mysql:3306 

Localhost inside a docker container is not the localhost of your computer.

Within a docker-compose network you access the service by its service name

Upvotes: 0

Related Questions