OS-Details:
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
code
Main file(Startup.java)
package com.baeldung.spring_project;
import io.r2dbc.spi.ConnectionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories;
import org.springframework.r2dbc.connection.R2dbcTransactionManager;
import org.springframework.transaction.ReactiveTransactionManager;
import java.beans.BeanProperty;
@SpringBootApplication
@EnableR2dbcRepositories
public class Startup {
public static void main(String[] args) {
SpringApplication.run(Startup.class, args);
}
@BeanProperty
public ReactiveTransactionManager transactionManager(ConnectionFactory connectionFactory) {
return new R2dbcTransactionManager(connectionFactory);
}
}
Controller file(ZipCodeApi.java)
package com.baeldung.spring_project;
import org.springframework.beans.factory.annotation.Autowired;
import com.baeldung.spring_project.domain.ZIPRepo;
import com.baeldung.spring_project.domain.ZipCode;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.r2dbc.UncategorizedR2dbcException;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.function.Function;
import java.util.function.Supplier;
@RestController
@RequestMapping("/zipcode")
public class ZipCodeApi {
@Autowired
private ZIPRepo zipRepo;
public ZipCodeApi(ZIPRepo zipRepo) {
this.zipRepo = zipRepo;
}
// Unique mapping for findById
@GetMapping("/{zipcode}")
public Mono<ZipCode> findById(@PathVariable String zipcode) {
return zipRepo.findById(zipcode);
}
@GetMapping("/city")
public Flux<ZipCode> findByCity(@RequestParam String city) {
return zipRepo.findByCity(city);
}
@PostMapping
public Mono<ZipCode> create(@RequestBody ZipCode zipCode) {
return zipRepo.findById(zipCode.getZip())
.switchIfEmpty(Mono.defer(createZipCode(zipCode)))
.onErrorResume(this::isKeyDuplicated, this.recoverWith(zipCode));
}
// Method to handle creation of new ZIP code
private Supplier<Mono<? extends ZipCode>> createZipCode(ZipCode zipCode) {
return () -> {
zipCode.setId(zipCode.getZip());
return zipRepo.save(zipCode);
};
}
private boolean isKeyDuplicated(Throwable ex) {
return ex instanceof DataIntegrityViolationException || ex instanceof UncategorizedR2dbcException;
}
private Function<? super Throwable, ? extends Mono<ZipCode>> recoverWith(ZipCode zipCode) {
return throwable -> zipRepo.findById(zipCode.getZip());
}
}
Compose file(Spring.yml)
version: '3.1'
services:
db:
image: mysql:5.7.38
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: baeldung
MYSQL_USER: nikhil
MYSQL_PASSWORD: nikhil123
command: [ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-u", "nikhil", "--password=nikhil123"]
volumes:
- ./schema.sql:/docker-entrypoint-initdb.d/schema.sql
app:
image: docker.io/library/spring-project:0.1-SNAPSHOT
ports:
- '8080:8080'
environment:
DB_URL: r2dbc:mysql://db:3306/baeldung?useSSL=true&requireSSL=true
HOST_HOSTNAME: ${EXTERNAL_IP}
depends_on:
db:
condition: service_healthy
deploy:
resources:
limits:
cpus: '3.00'
I added the data into my DB and tried with this URL “localhost:8080/zipcode/by_city?city=New%20York” but here I am facing 500 Internal Server Error.
#Udated Logs
"nikhil@nikhil-Latitude-7480:~/tutorials/quarkus-modules/quarkus-vs-springboot/spring-project/src/main/docker$ docker-compose up
Attaching to docker-app-1, docker-db-1
docker-app-1 | Setting Active Processor Count to 4
docker-app-1 | Calculating JVM memory based on 12669348K available memory
docker-app-1 | For more information on this calculation, see https://paketo.io/docs/reference/java-reference/#memory-calculator
docker-app-1 | Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx12276406K -XX:MaxMetaspaceSize=85741K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 12669348K, Thread Count: 50, Loaded Class Count: 12724, Headroom: 0%)
docker-app-1 | Enabling Java Native Memory Tracking
docker-app-1 | Adding 137 container CA certificates to JVM truststore
docker-app-1 | Spring Cloud Bindings Enabled
docker-app-1 | Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -XX:+ExitOnOutOfMemoryError -XX:ActiveProcessorCount=4 -XX:MaxDirectMemorySize=10M -Xmx12276406K -XX:MaxMetaspaceSize=85741K -XX:ReservedCodeCacheSize=240M -Xss1M -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics -Dorg.springframework.cloud.bindings.boot.enable=true
docker-app-1 |
docker-app-1 | . ____ _ __ _ _
docker-app-1 | /\ / ___'_ __ _ _(_)_ __ __ _
docker-app-1 | ( ( )___ | '_ | '_| | '_ / _` |
docker-app-1 | \/ ___)| |_)| | | | | || (_| | ) ) ) )
docker-app-1 | ' |____| .__|_| |_|_| |___, | / / / /
docker-app-1 | =========|_|==============|___/=/_/_/_/
docker-app-1 |
docker-app-1 | :: Spring Boot :: (v3.1.3)
docker-app-1 |
docker-app-1 |
docker-app-1 | 2024-09-16T11:19:27.687Z INFO 1 --- [ main] com.baeldung.spring_project.Startup : Starting Startup using Java 17.0.7 with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)
docker-app-1 | 2024-09-16T11:19:27.693Z INFO 1 --- [ main] com.baeldung.spring_project.Startup : No active profile set, falling back to 1 default profile: "default"
docker-app-1 | 2024-09-16T11:19:29.044Z INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data R2DBC repositories in DEFAULT mode.
docker-app-1 | 2024-09-16T11:19:29.345Z INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 282 ms. Found 1 R2DBC repository interfaces.
docker-app-1 | 2024-09-16T11:19:31.443Z WARN 1 --- [ main] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.baeldung.spring_project.domain.ZIPRepo
docker-app-1 | 2024-09-16T11:19:32.194Z INFO 1 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port 8080
docker-app-1 | 2024-09-16T11:19:32.212Z INFO 1 --- [ main] com.baeldung.spring_project.Startup : Started Startup in 5.333 seconds (process running for 6.14)
**docker-app-1 | 2024-09-16T11:23:02.415Z WARN 1 --- [or-http-epoll-2] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.baeldung.spring_project.ZipCodeApi
docker-app-1 | 2024-09-16T11:24:03.129Z ERROR 1 --- [tor-tcp-epoll-3] a.w.r.e.AbstractErrorWebExceptionHandler : [b08b1ffd-1] 500 Server Error for HTTP GET "/zipcode/by_city?city=New%20York"**
docker-app-1 |
docker-app-1 | org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection
docker-app-1 | at org.springframework.r2dbc.connection.ConnectionFactoryUtils.lambda$getConnection$0(ConnectionFactoryUtils.java:90) ~[spring-r2dbc-6.0.11.jar:6.0.11]
docker-app-1 | Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
docker-app-1 | Error has been observed at the following site(s):
docker-app-1 | *__checkpoint ? Handler com.baeldung.spring_project.ZipCodeApi#findById(String) [DispatcherHandler]
docker-app-1 | *__checkpoint ? HTTP GET "/zipcode/by_city?city=New%20York" [ExceptionHandlingWebHandler]
docker-app-1 | Original Stack Trace:
docker-app-1 | at org.springframework.r2dbc.connection.ConnectionFactoryUtils.lambda$getConnection$0(ConnectionFactoryUtils.java:90) ~[spring-r2dbc-6.0.11.jar:6.0.11]
docker-app-1 | at reactor.core.publisher.Mono.lambda$onErrorMap$28(Mono.java:3783) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.FluxRetry$RetrySubscriber.onError(FluxRetry.java:95) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:180) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.pool.AbstractPool$Borrower.fail(AbstractPool.java:475) ~[reactor-pool-1.0.1.jar:1.0.1]
docker-app-1 | at reactor.pool.SimpleDequePool.lambda$drainLoop$9(SimpleDequePool.java:433) ~[reactor-pool-1.0.1.jar:1.0.1]
docker-app-1 | at reactor.core.publisher.FluxDoOnEach$DoOnEachSubscriber.onError(FluxDoOnEach.java:186) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onError(MonoSubscribeOn.java:152) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:180) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:180) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:201) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.netty.resources.NewConnectionProvider$DisposableConnect.onError(NewConnectionProvider.java:154) ~[reactor-netty-core-1.1.10.jar:1.1.10]
docker-app-1 | at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.Operators.error(Operators.java:198) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.Mono.subscribe(Mono.java:4495) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) ~[reactor-core-3.5.9.jar:3.5.9]
docker-app-1 | at reactor.netty.transport.TransportConnector$MonoChannelPromise.tryFailure(TransportConnector.java:576) ~[reactor-netty-core-1.1.10.jar:1.1.10]
docker-app-1 | at reactor.netty.transport.TransportConnector$MonoChannelPromise.setFailure(TransportConnector.java:522) ~[reactor-netty-core-1.1.10.jar:1.1.10]
docker-app-1 | at reactor.netty.transport.TransportConnector.lambda$doConnect$7(TransportConnector.java:261) ~[reactor-netty-core-1.1.10.jar:1.1.10]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:583) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:559) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:629) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:118) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2.run(AbstractEpollChannel.java:614) ~[netty-transport-classes-epoll-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:153) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:416) ~[netty-transport-classes-epoll-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
docker-app-1 | Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: db/172.20.0.2:3306
docker-app-1 | at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$2.run(AbstractEpollChannel.java:613) ~[netty-transport-classes-epoll-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:153) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:416) ~[netty-transport-classes-epoll-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.97.Final.jar:4.1.97.Final]
docker-app-1 | at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
docker-app-1 |
docker-app-1 |
You’re seeing a 500 Internal Server Error in your Spring Boot application after updating the schema.sql file to insert data into the zipcode table. The application fails to connect to the MySQL database, with logs showing a timeout error (connection timed out: db/172.31.0.2:3306).
6