メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

Struts2+CDIでラムダを使ってるクラスでThere is no Action mapped for...が出る

誠に遺憾です

環境

Wildfly 10.0.0.Final
Struts 2.3.29
Struts Convention Plugin 2.3.29
Struts2 CDI Plugin 2.3.29
struts.xml での struts.enable.DynamicMethodInvocation は true

どこでどうエラーになるか

Wildfly始動時:問題なし

・(始動後初回) 作成したログイン画面にアクセス
ここでラムダを使ってる他画面のエラーが出る
(この時ログイン画面は表示されるので気づかない場合もあるかも?)

yyyy/MM/dd HH:mm:ss:SSS INFO Initializing Struts2 CDI integration...
yyyy/MM/dd HH:mm:ss:SSS INFO [lookup]: Checking for BeanManager under JNDI key java:comp/BeanManager
yyyy/MM/dd HH:mm:ss:SSS INFO Struts2 CDI integration initialized.
yyyy/MM/dd HH:mm:ss:SSS ERROR Unable to read class 【ここにラムダを使ってるクラスの完全修飾名が表示される】
java.lang.ArrayIndexOutOfBoundsException: 1117917
at org.objectweb.asm.ClassReader.readInt(Unknown Source) ~[asm-3.3.jar:3.3]
at org.objectweb.asm.ClassReader.accept(Unknown Source) ~[asm-3.3.jar:3.3]
at org.objectweb.asm.ClassReader.accept(Unknown Source) ~[asm-3.3.jar:3.3]
at com.opensymphony.xwork2.util.finder.DefaultClassFinder.readClassDef(DefaultClassFinder.java:473) ~[xwork-core-2.3.24.1.jar:2.3.24.1]
at com.opensymphony.xwork2.util.finder.DefaultClassFinder.<init>(DefaultClassFinder.java:96) ~[xwork-core-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildClassFinder(PackageBasedActionConfigBuilder.java:416) [struts2-convention-plugin-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.findActions(PackageBasedActionConfigBuilder.java:397) [struts2-convention-plugin-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:354) [struts2-convention-plugin-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) [struts2-convention-plugin-2.3.24.1.jar:2.3.24.1]
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:274) [xwork-core-2.3.24.1.jar:2.3.24.1]
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) [xwork-core-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:967) [struts2-core-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:435) [struts2-core-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:479) [struts2-core-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74) [struts2-core-2.3.24.1.jar:2.3.24.1]
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57) [struts2-core-2.3.24.1.jar:2.3.24.1]
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:84) [wildfly-undertow-10.0.0.Final.jar!/:10.0.0.Final]
at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:97) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:79) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.core.ManagedFilter.getFilter(ManagedFilter.java:65) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.jsp.JspFileHandler.handleRequest(JspFileHandler.java:32) [jastow-2.0.0.Final.jar!/:2.0.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) [wildfly-undertow-10.0.0.Final.jar!/:10.0.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) [wildfly-undertow-10.0.0.Final.jar!/:10.0.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174) [undertow-servlet-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793) [undertow-core-1.3.15.Final.jar!/:1.3.15.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]

・ログイン処理自体もOK
Struts2、CDI(Weld)、EJB、JPA(Hibernate)は正常に動いているように見える。
(厳密に言うと、この処理で対象となるクラスのCDIが動いている)

・対象の画面に遷移
次のエラーが出ます

com.opensymphony.xwork2.config.ConfigurationException: There is no Action mapped for namespace [/対象のActionクラス] and action name [] associated with context path [/コンテキストルート].

There is no Action mapped for...って

Struts2やったことある人なら一度は見たことある404的なエラーなんですが
調べると初歩的な解決方法しか出ないんですよね。

エラーのアプローチも悪いし(というか先にArrayIndexOutOfBoundsExceptionが出てて原因はそこから追跡しないとダメなんだけど)
苦しい・・・非常にハマりポイントになる。

Struts2のCDI対象クラスでラムダが使えない!?

kamegu.hateblo.jp

上記のブログでは
ラムダ使用箇所を別クラスに出して
Inject対象から外すため@Vetoedアノテーションを付けています。

これでいけるんですが、CDIってEE標準なのにラムダ使えないって納得いかん

と思ったらStruts 2 Java 8 Support Plugin

qiita.com

これで動くようになったのですが、まぁ納得いきませんわな。