Reputation: 1
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
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