월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 기반 REST API 개발
h2 DB 의존성 질문입니다
지금 인텔리제이에서 스프링부트를 시작하면 버전이 2.4.3으로 되어 있어서 pom.xml가서 2.1.0.RELEASE로 변경하였습니다 그리고 강의 내용처럼 com.h2database의 스코프를 test로 변경 후 돌려보았는데 에러가 나고 test스코프 부분을 아예 없애버리면 에러가 나지 않습니다. 왜 그런지 궁금합니다.
- 미해결스프링 기반 REST API 개발
junit 테스트
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.datatype.jsr310.JavaTimeModule]: Unresolvable class definition; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123) ~[spring-boot-test-2.4.3.jar:2.4.3] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.outputConditionEvaluationReport(SpringBootDependencyInjectionTestExecutionListener.java:53) ~[spring-boot-test-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:46) ~[spring-boot-test-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) ~[junit.jar:4.12] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) ~[junit.jar:4.12] at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) ~[junit.jar:4.12] at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) ~[junit.jar:4.12] at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) ~[junit.jar:4.12] at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) ~[junit.jar:4.12] at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.runners.ParentRunner.run(ParentRunner.java:363) ~[junit.jar:4.12] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.runner.JUnitCore.run(JUnitCore.java:137) ~[junit.jar:4.12] at org.junit.runner.JUnitCore.run(JUnitCore.java:115) ~[junit.jar:4.12] at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40) ~[org.junit.vintage.engine_5.4.0.v20190212-2109.jar:5.4.0] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na] at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[na:na] at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) ~[na:na] at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80) ~[org.junit.vintage.engine_5.4.0.v20190212-2109.jar:5.4.0] at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71) ~[org.junit.vintage.engine_5.4.0.v20190212-2109.jar:5.4.0] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209) ~[.cp/:na] Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.datatype.jsr310.JavaTimeModule]: Unresolvable class definition; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.4.jar:5.3.4] ... 64 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.datatype.jsr310.JavaTimeModule]: Unresolvable class definition; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:157) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.registerWellKnownModulesIfAvailable(Jackson2ObjectMapperBuilder.java:837) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(Jackson2ObjectMapperBuilder.java:697) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build(Jackson2ObjectMapperBuilder.java:680) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.<init>(MappingJackson2HttpMessageConverter.java:59) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter.<init>(AllEncompassingFormHttpMessageConverter.java:91) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.<init>(RequestMappingHandlerAdapter.java:215) ~[spring-webmvc-5.3.4.jar:5.3.4] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.createRequestMappingHandlerAdapter(WebMvcConfigurationSupport.java:698) ~[spring-webmvc-5.3.4.jar:5.3.4] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.createRequestMappingHandlerAdapter(WebMvcAutoConfiguration.java:384) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerAdapter(WebMvcConfigurationSupport.java:667) ~[spring-webmvc-5.3.4.jar:5.3.4] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.requestMappingHandlerAdapter(WebMvcAutoConfiguration.java:369) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.4.jar:5.3.4] ... 65 common frames omitted Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na] at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) ~[na:na] at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:na] at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137) ~[na:na] at java.base/java.lang.Class.getConstructor0(Class.java:3342) ~[na:na] at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553) ~[na:na] at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) ~[spring-beans-5.3.4.jar:5.3.4] ... 80 common frames omitted Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ser.std.ToStringSerializerBase at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] ... 94 common frames omitted 2021-03-22 17:09:32.544 ERROR 57248 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@2dc995f4] to prepare test instance [com.rest.api.EventControllerTests@6475472c] java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) ~[spring-boot-test-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) ~[junit.jar:4.12] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) ~[junit.jar:4.12] at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) ~[junit.jar:4.12] at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) ~[junit.jar:4.12] at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) ~[junit.jar:4.12] at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) ~[junit.jar:4.12] at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.runners.ParentRunner.run(ParentRunner.java:363) ~[junit.jar:4.12] at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) ~[spring-test-5.3.4.jar:5.3.4] at org.junit.runner.JUnitCore.run(JUnitCore.java:137) ~[junit.jar:4.12] at org.junit.runner.JUnitCore.run(JUnitCore.java:115) ~[junit.jar:4.12] at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40) ~[org.junit.vintage.engine_5.4.0.v20190212-2109.jar:5.4.0] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na] at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[na:na] at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[na:na] at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:na] at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na] at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na] at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na] at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na] at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) ~[na:na] at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80) ~[org.junit.vintage.engine_5.4.0.v20190212-2109.jar:5.4.0] at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71) ~[org.junit.vintage.engine_5.4.0.v20190212-2109.jar:5.4.0] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137) ~[org.junit.platform.launcher_1.4.0.v20190212-2109.jar:1.4.0] at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) ~[.cp/:na] at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209) ~[.cp/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerAdapter' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.datatype.jsr310.JavaTimeModule]: Unresolvable class definition; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1334) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123) ~[spring-boot-test-2.4.3.jar:2.4.3] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.3.4.jar:5.3.4] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.3.4.jar:5.3.4] ... 46 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]: Factory method 'requestMappingHandlerAdapter' threw exception; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.datatype.jsr310.JavaTimeModule]: Unresolvable class definition; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.4.jar:5.3.4] ... 65 common frames omitted Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.datatype.jsr310.JavaTimeModule]: Unresolvable class definition; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:157) ~[spring-beans-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.registerWellKnownModulesIfAvailable(Jackson2ObjectMapperBuilder.java:837) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.configure(Jackson2ObjectMapperBuilder.java:697) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.build(Jackson2ObjectMapperBuilder.java:680) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.<init>(MappingJackson2HttpMessageConverter.java:59) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter.<init>(AllEncompassingFormHttpMessageConverter.java:91) ~[spring-web-5.3.4.jar:5.3.4] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.<init>(RequestMappingHandlerAdapter.java:215) ~[spring-webmvc-5.3.4.jar:5.3.4] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.createRequestMappingHandlerAdapter(WebMvcConfigurationSupport.java:698) ~[spring-webmvc-5.3.4.jar:5.3.4] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.createRequestMappingHandlerAdapter(WebMvcAutoConfiguration.java:384) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.requestMappingHandlerAdapter(WebMvcConfigurationSupport.java:667) ~[spring-webmvc-5.3.4.jar:5.3.4] at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.requestMappingHandlerAdapter(WebMvcAutoConfiguration.java:369) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.4.jar:5.3.4] ... 66 common frames omitted Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na] at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) ~[na:na] at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:698) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:na] at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3137) ~[na:na] at java.base/java.lang.Class.getConstructor0(Class.java:3342) ~[na:na] at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553) ~[na:na] at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) ~[spring-beans-5.3.4.jar:5.3.4] ... 81 common frames omitted Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ser.std.ToStringSerializerBase at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] ... 95 common frames omitted 이부분 에러가 나는데 어디부분인지 잘모르겠습니다.
- 미해결스프링 기반 REST API 개발
self-descrive messages 와 hateoas에 대해 질문이 있습니다.
질문1 self-descrive messages 기준에 대해 질문: front 에서 backend로 api 요청을 날려 응답을 받았을때 그 응답 데이터가 문서화 되어 제목을 통해 응답 데이터의 용도를 유추할수 있거나 아니면 응답 객체중 응답의 의미가 뭔지 알수 있게끔 하는 어떤 형식의 데이터가 포함되어 있으면 self-descrive messages 라는 기준을 만족하는건가요? 질문2:hateoas는 응답과 연관된 다른 요청을 프론트엔드에서 직접작성하는게 아니라 응답 내의 데이터를 이용해 바로 링크 설정을 할수 있게 한다는 의미인가요?
- 해결됨스프링 기반 REST API 개발
질문있습니다.
좋은 강의 만들어주셔서 많이 배우고 있습니다. 감사합니다. 다름이 아니라 강의 수강 중 테스트가 실패하여 문의드립니다. 해당 강의 전까지는 메이븐 프로젝트로 생성하여 의존성 추가해서 강의의 스프링부트 버전(2.1.0.RELEASE)로 진행하여 문제 없이 진행하였는데 EventControllerTests - createEvent 테스트코드 작성시 mockMvc.perform(post("/api/events/") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(event))) .andDo(print()) .andExpect(status().isCreated()) .andExpect(jsonPath("id").exists()) .andExpect(jsonPath("$.id").exists()) .andExpect(header().exists(HttpHeaders.LOCATION)) .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE)) .andExpect(jsonPath("free").value(false)) .andExpect(jsonPath("offline").value(true)) .andExpect(jsonPath("eventStatus").value(EventStatus.DRAFT.name())) .andExpect(jsonPath("_links.self").exists()) //.andExpect(jsonPath("$._links.self").exists()) .andExpect(jsonPath("_links.query-events").exists()) .andExpect(jsonPath("_links.update-event").exists()) .andDo(document("create-event", links( linkWithRel("self").description("link to self"), linkWithRel("query-events").description("link to query events"), linkWithRel("update-event").description("link to update an existing event") ) )); 위와 같이 작성하면 실패하고 org.springframework.restdocs.snippet.SnippetException: Links with the following relations were not found in the response: [self, update-event, query-events] .andDo(document("create-event", links(halLinks(), linkWithRel("self").description("link to self"), linkWithRel("query-events").description("link to query events"), linkWithRel("update-event").description("link to update an existing event") ) )); links의 첫번째 인자로 haLinks()를 주면 테스트가 성공하는 것을 확인하였습니다. 원인을 파악하기 위해 검색도 해보고 강의도 다시 보던 중에 KSUG에서 발표하셨다고 하던 이전 자료(해당 강의의 시작)를 보니 halLinks()가 있는 것을 보았고 해당 코드가 있는 깃랩(https://gitlab.com/whiteship/natural/-/blob/master/src/test/java/me/whiteship/natural/event/EventControllerTests.java)에서도 보니 halLinks()가 있는 것을 확인하였습니다. 메이븐 프로젝트로 생성해서 버전이랑 의존성 꼬이는 문제는 없을것 같은데 <artifactId>asciidoctor-maven-plugin</artifactId> <version>1.5.8</version> asciidoctor-maven-plugin의 버전이 제가 작성한 버전은 1.5.8이고 기선님이 사용한 버전은 1.5.3인 차이만 확인하였습니다. 무슨 차이로 인해 테스트가 실패하는 것인지 감이 안잡히는데 기선님은 두 가지 방식 다 진행하였고 성공하여서 질문드립니다. 테스트 실패 시 출력하는 요청,응답 헤더 MockHttpServletRequest: Headers = {Content-Type=[application/json;charset=UTF-8], Accept=[application/json]} MockHttpServletResponse: Headers = {Location=[http://localhost:8080/api/events/1], Content-Type[application/json;charset=UTF-8]} json 출력결과도 첨부합니다. { "id" : 1, "name" : Spring, "description" : REST API Development with Spring, "beginEnrollmentDateTime" : 2018-11-23T14:21:00, "closeEnrollmentDateTime" : 2018-11-24T14:21:00, "beginEventDateTime" : 2018-11-25T14:21:00, "endEventDateTime" : 2018-11-26T14:21:00, "location" : 강남역 D2 스타텁 팩토리, "basePrice" : 100, "maxPrice" : 200, "limitOfEnrollment" : 100, "offline" : true, "free" : false, "eventStatus" : DRAFT, "_links" : -{ "self" : -{ "href" : http://localhost:8080/api/events/1 }, "query-events" : -{ "href" : http://localhost:8080/api/events }, "update-event" : -{ "href" : http://localhost:8080/api/events/1 } } } 깃헙 링크도 첨부합니다!https://github.com/rshak8912/rest
- 미해결스프링 기반 REST API 개발
테스트시 enum 값 불일치
public enum EventStatus { DRAFT, PUBLISHED, BEGAN_ENROLLMENT;} @Enumerated(EnumType.STRING)private EventStatus eventStatus = EventStatus.DRAFT; // 기본값 설정 @Test@TestDescription("정상적으로 이벤트를 생성하는 테스트")public void createEvent() throws Exception { EventDto event = EventDto.builder() .name("Spring") .description("REST API Development with Spring") .beginEnrollmentDateTime(LocalDateTime.of(2018, 11, 23, 14, 21)) .closeEnrollmentDateTime(LocalDateTime.of(2018, 11, 24, 14, 21)) .beginEventDateTime(LocalDateTime.of(2018, 11, 25, 14, 21)) .endEventDateTime(LocalDateTime.of(2018, 11, 26 , 14, 21)) .basePrice(100) .maxPrice(200) .limitOfEnrollment(100) .location("강남역 D2 스타텁 팩토리") .build(); //Mockito.when(eventRepository.save(event)).thenReturn(event); mockMvc.perform(post("/api/events") .contentType(MediaType.APPLICATION_JSON_VALUE) .accept(MediaTypes.HAL_JSON_VALUE) .content(objectMapper.writeValueAsString(event))) .andDo(print()) .andExpect(status().isCreated()) .andExpect(jsonPath("id").exists()) .andExpect(header().exists(HttpHeaders.LOCATION)) .andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE)) .andExpect(jsonPath("id").value(Matchers.not(100))) .andExpect(jsonPath("free").value(false)) .andExpect(jsonPath("offline").value(true)) .andExpect(jsonPath("eventStatus").value(EventStatus.DRAFT)); java.lang.AssertionError: JSON path "eventStatus" Expected :DRAFT Actual :DRAFT 위와 같은 오류가 발생합니다. 아래와 같이 String 값을 직접 입력해주면 통과하구요... .andExpect(jsonPath("eventStatus").value("DRAFT")); 어떻게 해결해야 할 지 알고싶습니다.
- 미해결스프링 기반 REST API 개발
Entity 에 메서드
안녕하세요. 궁금한 내용이 생겨서 질문 올립니다. Entity 란 DB의 테이블과 매핑되는 객체라고 알고 있는데, update()라는 메서드가 엔티티에 들어가도 괜찮은 건가요? Entity 의 필드 값을 변경시키는 것이므로 Dto 나 다른 곳에서 update 가 되어야 하지 않을까 하는 궁금증입니다.
- 미해결스프링 기반 REST API 개발
Repository save 질문드립니다.
ModelMapper를 이용하여 EventDto → Event 객체로 전환 후 Repository에 save한 결과값이 null이 나옵니다. 디버깅 결과 eventRepository 빈도 주입이 되었는데, save 메서드 결과가 null이 나오네요. pom.xml 파일의 h2database scope를 test로 주든, 주지 않든 save한 결과인 newEvent.getId() 메서드 호출시 동일한 NullPointerExeptionError가 발생합니다. 무엇이 문제일까요?ㅠㅠ
- 미해결스프링 기반 REST API 개발
junit5 에서의 spring-restdoce 설정
junit5 환경에서 테스트 중에 REST Docs configuration not found. Did you forget to apply a MockMvcRestDocumentationConfigurer when building the MockMvc instance? 오류가 발생 하여 찾아 보던중 @ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) public class JUnit5ExampleTests { 이렇게 진행 하라는 가이드가 확인 되어 @SpringBootTest @AutoConfigureMockMvc //@AutoConfigureRestDocs @ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) public class EventControllerTests { 위와 같이 설정 하고 @BeforeEach public void setup(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) { this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx) .addFilters(new CharacterEncodingFilter("UTF-8", true)) // 필터 추가 .apply(documentationConfiguration(restDocumentation)) .build(); } setup 추가 하여 진행 하였습니다. 혹시 다른 확인사항이나 @AutoConfigureRestDocs 이 적용이 안되는듯 한데 이게 적용이 안되면 다른 문제가 있는걸까요? junit4 에서 junit5 로 변경 될때 설정 사항은 링크 에서 확인 가능 합니다 https://docs.spring.io/spring-restdocs/docs/current/reference/html5/#getting-started-documentation-snippets-setup
- 해결됨스프링 기반 REST API 개발
Controller 코드 관련 질문입니다.
좋은 강의 감사드립니다. 한국은 설 연휴가 시작되었는데 새해 복많이 받으세요! 10분40초경 return 해줄 때 ResponseEntity의 body에 event가 아니라 newEvent를 반환해줘야 될 것 같은데 아닌가요..? 현재 코드상 event 는 modelmapper를 활용해서 만든 event객체라 id값이 없고 테스트를 실패할것 같은데 body에 event를 넘겨줘도 테스트에서 return 된 body 에는 id값이 들어가있고 테스트가 통과되는데 제가 놓친부분이 궁금합니다.
- 미해결스프링 기반 REST API 개발
인증 상태에 따른 Api 문서화 질문입니다.
안녕하세요. 항상 좋은 강의 감사합니다!!강의를 듣고 코드를 추가로 작성하다가 인증상태에 따라 api 문서화를 어떻게 관리해야하는 것이 좋은지 궁금해서 질문을 하게 되었습니다. 인증된 사용자와 인증되지 않은 사용자는 request-header도 다르고 api에 링크가 다르게 되는데 두개의 테스트를 통해 (하나의 테스트에는 token을 추가하고 다른 하나는 추가하지 않는) document를 각각 사용해서 따로 문서화를 하는 것이 좋을까요??
- 미해결스프링 기반 REST API 개발
AccountAdapter를 만들어서 테스트를 돌리는 부분에서 에러가 발생하는데 이 부분이 해결이 잘 안됩니다.
기선님 안녕하세요 : ) 항상 강의 잘 듣고있습니다!! 강의를 따라하는데 발생한 에러가 발생해서 이리저리 해결해보려고 했으나, 혼자서 해결하지 못해, 이렇게 질문을 올리게 되었습니다. (강의 부분 11:47 의 테스트 관련된 질문입니다!) Spring Security의 User 타입이 아닌 Account로 인증된 정보를 받아오기 위해서 AccountAddapter를 만들고, @AuthenticationPrincipal 애너테이션을 이용하여 AccountAdapter 타입의 currentUser를 파라미터로 받아오게 queryEvents 메서드에서 설정하고, 테스트도 강의 내용과 동일하게 작성했습니다. 결론은 테스트 코드가 실패하고 있고, NullPointerException이 발생하고 있습니다. ControllerTest 안에 있는 AccessToken을 발급 받는 메서드 내에서 "/oauth/token" url로 post 요청을 해서 받아온 결과 responseBody가 요청에 대해 제대로 된 결과를 받아오지 못하는 것 같습니다. 아래에 깃헙 주소와 에러 스크린샷도 첨부드립니다. 감사합니다 : ) 🙇♂️ 깃헙 : 깃헙 저장소
- 미해결스프링 기반 REST API 개발
Spring Cloud Gateway와 함께 사용 시 _link에 대하여
API서버를 만들고 HATEOAS를 구성하던 도중 문제점을 발견하여 질문을 남깁니다. SpringCloudGateway(8090) - EurekaServer(8761) - REST API Server(8081) 를 만들어두고 API서버에는 HATEOAS를 구현했습니다. 그런데 게이트웨이를 통해서 api를 호출할때도 _links는 계속 8081로 생성이 되더군요. gateway의 주소로 _link를 생성하고 싶은데, 찾아보니 대부분 zuul로 설정하는 방법만 나오더군요. x-forwarded-for를 통해 주소를 넘겨서 처리가 가능할 것 같긴한데, api 서버에 x-forwarded-for를 넘기기만 하면 _link를 생성할 때 알아서 해당 헤더값을 참고해서 만들까요? 어떻게 설정을 해야할지 감이 잡히질 않습니다...hateoas에 관련된 질문이라기보단 spring cloud에 관련 된 질문이지만 따로 cloud 에 관련된 강의가 없다보니 혹시나 싶은 마음에 이곳에 질문을 남겨봅니다.
- 미해결스프링 기반 REST API 개발
ErrorResource 추가후 발생되는 에러 입니다.
안녕하세요. 늘 좋은 강의 감사합니다. 강의를 듣고 테스트를 하면서 갑자기 발생되는 에러 2가지를 못잡아 질문을 드립니다. 1. 아래의 코드를 실행시키게 되면 NullpointException이 발생이됩니다.. @SpringBootTest@AutoConfigureMockMvc@AutoConfigureRestDocs@Import(RestDocsConfiguration.class)@ActiveProfiles("test")public class IndexControllerTest { @Autowired MockMvc mockMvc; @Test public void index() throws Exception { this.mockMvc.perform(get("/api/")) .andExpect(status().isOk()) .andExpect(jsonPath("_links.events").exists()); }} 하지만. 아래의 같이 코드를 실행시키면 links는 잘 작동됩니다. 2. createEvent_Bad_Request 테스트 코드 실행시 발생되는 에러.. 저게 의도한 것은 400에러였지만 201이 나와 매우 당황스럽습니다.(이강의대로 하기전에는 에러 잘 잡았습니다.) 현재 스프링부트 2.4.2 버전을 사용중입니다. 해당 코드는 https://github.com/rlawls1991/study_api 에서 받을 수 있으며 버전은 4ee4139 기준으로 확인할 수 있습니다.!
- 미해결스프링 기반 REST API 개발
HATEOS에서 ResourceSupport 대신 EntityModel을 쓸 경우 JsonUnwrapped를 안쓰는 방법이 있나요?
Spring boot 버전을 2.2 버전을 사용하면서 강의에 있는 코드들을 작성해보고 있는데, ResourceSupport가 없어서 강사님의 github를 보니 EntityModel을 대신 사용하셨더라구요. 사용해보니 동작은 잘 되는거같은데, 해당 클래스를 살펴보니 @JsonUnwrapped가 기본 사용이더군요. 만약에 event 로 한번 더 감싸고 데이터를 내보내고 싶다면 어떤방식을 사용해야 하나요?
- 스프링 기반 REST API 개발
EventResource 질문입니다!
삭제된 글입니다
- 미해결스프링 기반 REST API 개발
포스트맨에서 form과 raw차이점
제가 이 강의를 보면서 화면은 vuejs로 연습해보려는데 request를 form이랑 raw(json)으로 보내는것이 코딩하는방식이 달라서 질문합니다 form으로 보낼땐 앞단에서 form을 생성해서 바인딩해서 보내줘야 하는데 raw로 보내면 그럴필요없이 보내서 편한거 같은데 어떤방식을 써야하는건가요? post요청할때 입니다
- 미해결스프링 기반 REST API 개발
HATEOAS 질문
강의를 듣다보니까 과거에 제가 네이버 댓글 크롤링을 한 기억이 생각 났는데요. 그 곳에서 현재 댓글 목록을 보는 API 응답으로 다음 댓글 페이지, 이전 댓글 페이지 URL이 JSON 요소로 담겨서 왔는데 이런 것이 HATEOAS를 지키는 예라고 이해하면 되나요?
- 미해결스프링 기반 REST API 개발
Junit5 ParameterizedTest 를 이용해보았습니다.
@ParameterizedTest @MethodSource("paramsForTestFree") public void testFree(int basePrice, int maxPrice, boolean isFree) { // given Event event = Event.builder() .basePrice(basePrice) .maxPrice(maxPrice) .build(); // when event.update(); // then assertThat(event.isFree()).isEqualTo(isFree); } @ParameterizedTest @MethodSource("paramsForTestOffline") void testOffline(String location, boolean isOffline) { // given Event event = Event.builder() .location(location) .build(); // when event.update(); // then assertThat(event.isOffline()).isEqualTo(isOffline); } private static Stream<Arguments> paramsForTestFree() { // argument source method return Stream.of( Arguments.of(0,0, true), Arguments.of(100, 0, false), Arguments.of(0, 100, false), Arguments.of(100, 200, false) ); } private static Stream<Arguments> paramsForTestOffline() { // argument source method return Stream.of( Arguments.of("강남", true), Arguments.of(null, false), Arguments.of(" ", false) ); } JUNIT5를 이용하시는분들에게 도움이 되었으면 좋겠습니다.
- 해결됨스프링 기반 REST API 개발
configure(WebSecurity web) ignore가 않됨니다.
선생님. 안녕하세요. docs/index.html에 접근해도 login페이지로 이동합니다. @Configuration@EnableWebSecurityextends WebSecurityConfigurerAdapter{ 모두 확인했습니다. Git에 올려두었습니다. 도와주셔요..ㅠㅠ https://github.com/tialla-kka/spring-rest-api/commit/40b1b793df3fb1452416c02f11150e605d0c41aa
- 미해결스프링 기반 REST API 개발
ErrorsResource 추가후 Status 500 error
안녕하세요. 선생님~~ errorsresourece 적용 후에 -body부분도 {}빈값으로 넘어오고 -500 에러가 나오는데 어디가 문제인지 모르겠어요. ㅠㅠ git에 올려두었어요..^^;; https://github.com/tialla-kka/spring-rest-api