こんな感じのServlet-Contextを用意していましたが、動きません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | servlet-context < pre > <? xml version = "1.0" encoding = "UTF-8" ?> xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:beans = "http://www.springframework.org/schema/beans" xmlns:mvc = "http://www.springframework.org/schema/mvc" xmlns:sec = "http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- Enables the Spring MVC @Controller programming model --> < annotation-driven /> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> < resources mapping = "/resources/**" location = "/resources/" /> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> < beans:bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > < beans:property name = "prefix" value = "/WEB-INF/views/" /> < beans:property name = "suffix" value = ".jsp" /> </ beans:bean > < context:component-scan base-package = "byond.team.support" /> < sec:http > < sec:intercept-url pattern = "/**" access = "isAuthenticated()" /> < sec:form-login /> </ sec:http > < sec:authentication-manager /> ↑ここにSpring-Securityの設定がまとめて書いてある </ beans:beans > </ pre > < pre > <? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" > <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> < context-param > < param-name >contextConfigLocation</ param-name > < param-value >/WEB-INF/spring/root-context.xml</ param-value > </ context-param > <!-- Creates the Spring Container shared by all Servlets and Filters --> < listener > < listener-class >org.springframework.web.context.ContextLoaderListener</ listener-class > </ listener > <!-- Processes application requests --> < servlet > < servlet-name >appServlet</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < init-param > < param-name >contextConfigLocation</ param-name > < param-value >/WEB-INF/spring/appServlet/servlet-context.xml</ param-value > ↑ここでServlet-context.xmlを読み込んでいる。この中にSpring-Securityの設定も書いてある。 </ init-param > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >appServlet</ servlet-name > < url-pattern >/</ url-pattern > </ servlet-mapping > < filter > < filter-name >springSecurityFilterChain</ filter-name > < filter-class >org.springframework.web.filter.DelegatingFilterProxy</ filter-class > </ filter > < filter-mapping > < filter-name >springSecurityFilterChain</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > </ web-app > </ pre > |
動かんのじゃ。
何故なのか。調べたら非常に簡単なことでした。
Spring-Securityの設定は別だしにした方がいいよとのこと。
しかも<servlet>タグの中で呼んではいけないらしい。
読み込みのタイミングがサーブレット用の機能とFilter用の機能で違うからとのこと。
これは言われたら当たり前のことですね。
というわけで、Servlet-context.xmlを修正
1 2 3 4 5 6 7 | < pre > < sec:http > < sec:intercept-url pattern = "/**" access = "isAuthenticated()" /> < sec:form-login /> </ sec:http > < sec:authentication-manager /> </ pre > |
を除外して、新しくspring-security-context.xmlを作成
そしてTomcatを起動!!
・・・・・動かんのじゃ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityAuthentication' : Injection of autowired dependencies failed; nested exception is java.lang.NoSuchMethodError: org.springframework.security.core.userdetails.User.withUsername(Ljava/lang/String;)Lorg/springframework/security/core/userdetails/User$UserBuilder; at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java: 379 ) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java: 1348 ) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java: 578 ) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java: 501 ) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$ 0 (AbstractBeanFactory.java: 317 ) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java: 228 ) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java: 315 ) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java: 199 ) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java: 760 ) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java: 869 ) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java: 550 ) at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java: 672 ) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java: 638 ) at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java: 686 ) at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java: 554 ) at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java: 499 ) at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java: 172 ) at javax.servlet.GenericServlet.init(GenericServlet.java: 158 ) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java: 1227 ) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java: 1140 ) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java: 1027 ) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java: 5038 ) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java: 5348 ) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java: 145 ) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java: 1408 ) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java: 1398 ) at java.util.concurrent.FutureTask.run(FutureTask.java: 266 ) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1142 ) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 617 ) at java.lang.Thread.run(Thread.java: 745 ) Caused by: java.lang.NoSuchMethodError: org.springframework.security.core.userdetails.User.withUsername(Ljava/lang/String;)Lorg/springframework/security/core/userdetails/User$UserBuilder; at org.springframework.security.config.annotation.authentication.configurers.provisioning.UserDetailsManagerConfigurer$UserDetailsBuilder.username(UserDetailsManagerConfigurer.java: 111 ) at org.springframework.security.config.annotation.authentication.configurers.provisioning.UserDetailsManagerConfigurer$UserDetailsBuilder.access$ 200 (UserDetailsManagerConfigurer.java: 81 ) at org.springframework.security.config.annotation.authentication.configurers.provisioning.UserDetailsManagerConfigurer.withUser(UserDetailsManagerConfigurer.java: 72 ) at byond.team.support.WebSecurityAuthentication.configureGlobal(WebSecurityAuthentication.java: 60 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 ) at java.lang.reflect.Method.invoke(Method.java: 498 ) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java: 699 ) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java: 91 ) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java: 373 ) ... 29 more |
なんだこれは。
Lorg/springframework/security/core/userdetails/User$UserBuilder; メソッドが無いらしい。
調べてみると、Spring security 4.2.4 以降で登場したとのこと。
そもそも今、バージョンいくつが入っているんだ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | pom.xml < properties > < java-version >1.6</ java-version > < org.springframework-version >5.0.6.RELEASE</ org.springframework-version > < org.aspectj-version >1.6.10</ org.aspectj-version > < org.slf4j-version >1.6.6</ org.slf4j-version > </ properties > < dependencies > <!-- Spring --> < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-context</ artifactId > < version >${org.springframework-version}</ version > < exclusions > <!-- Exclude Commons Logging in favor of SLF4j --> < exclusion > < groupId >commons-logging</ groupId > < artifactId >commons-logging</ artifactId > </ exclusion > </ exclusions > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-webmvc</ artifactId > < version >${org.springframework-version}</ version > </ dependency > <!-- ... other dependency elements ... --> < dependency > < groupId >org.springframework.security</ groupId > < artifactId >spring-security-core</ artifactId > < version >4.1.3.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework.security</ groupId > < artifactId >spring-security-web</ artifactId > < version >4.2.2.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework.security</ groupId > < artifactId >spring-security-config</ artifactId > < version >4.2.2.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework.security</ groupId > < artifactId >spring-security-taglibs</ artifactId > < version >4.2.2.RELEASE</ version > </ dependency > < dependency > < groupId >org.thymeleaf.extras</ groupId > < artifactId >thymeleaf-extras-springsecurity4</ artifactId > < version >2.1.2.RELEASE</ version > </ dependency > </ pre > |
4.1.3じゃないですか。
これはネットで調べながら作業をした時の弊害ですね。
色んな情報を持ってくるのでこの辺の整合性が失われて、変なエラーが起こるんですね。
この辺の古いSpring-Securityを5.0.5.RELEASEに変更して起動したら動きました。
うーん。しょぼいミスだけど、こういうのこそ解決に時間が掛かっちゃうんですよね。
色んなサイトの情報は正しく反映しているわけですから。
気を付けよう。