I am using Play 2.2.1 with Spring 4.0.1 for DI. I am using deadbolt-java version 2.2-RC1 for authorization. Whenever I access any request handler annotated with Deadbolt annotation such as this: @SubjectPresent(handler = BaseDeadboltHandler.class) I am seeing an exception generated by Deadbolt:
play.api.Application$$anon$1: Execution
exception[[NoSuchBeanDefinitionException: No qualifying bean of type
[be.objectify.deadbolt.java.actions.SubjectPresentAction] is defined]]
at play.api.Application$class.handleError(Application.scala:293)
~[play_2.10.jar:2.2.2-RC1]
at play.api.DefaultApplication.handleError(Application.scala:399)
[play_2.10.jar:2.2.2-RC1]
at
play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261)
[play_2.10.jar:2.2.2-RC1]
at
play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:261)
[play_2.10.jar:2.2.2-RC1]
at scala.Option.map(Option.scala:145) [scala-library.jar:na]
at
play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$2.applyOrElse(PlayDefaultUpstreamHandler.scala:261)
[play_2.10.jar:2.2.2-RC1]
Caused by:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type
[be.objectify.deadbolt.java.actions.SubjectPresentAction] is defined
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:318)
~[spring-beans-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:985)
~[spring-context-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at Global.getControllerInstance(Global.java:139) ~[classes/:na]
at
play.core.j.JavaGlobalSettingsAdapter.getControllerInstance(JavaGlobalSettingsAdapter.scala:46)
~[play_2.10.jar:2.2.2-RC1]
at play.core.j.JavaAction$$anonfun$8.apply(JavaAction.scala:80)
~[play_2.10.jar:2.2.2-RC1]
at play.core.j.JavaAction$$anonfun$8.apply(JavaAction.scala:77)
~[play_2.10.jar:2.2.2-RC1]
This is probably because Spring is trying to manage the deadbolt classes using it's bean container. Can this be avoided? Is there a way I can tell Spring to not look for beans for deadbolt annotations?
I had a similar problem with Security.AuthenticatedAction that I found the answer for here https://groups.google.com/forum/#!topic/play-framework/gV596rEE_MU . The easiest thing you can do is define the dynamicAction as a bean.
@Bean
public be.objectify.deadbolt.java.actions.DynamicAction dynamicAction(){
return new be.objectify.deadbolt.java.actions.DynamicAction();
}
of course this could be a problem if you have more than one @DynamicAction. Hope it helps.