Java EE 6には、のjavax.security.Principal
ようなインジェクションに使用できる組み込みのBeanタイプがあります@Inject Principal principal;
。
これはデフォルトであり、代わりにプロデューサーメソッドを提供するなどして変更する方法があるかどうか疑問に思っています。
現状では、プロデューサーメソッドを作成すると、デプロイメント例外が発生します。
プロデューサーの例:
my.package;
import javax.security.Principal;
public class MyProducer {
...
@Produces
public Principal obtainPrincipal() {
return getMyPrincipal();
}
}
例外:
org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [Principal] with qualifiers [@Default] at injection point [[parameter 1] of [constructor] @Inject public my.package.MyType(Principal, SomeOtherType)]. Possible dependencies [[Producer Method [Principal] with qualifiers [@Any @Default] declared as [[method] @Produces @SessionScoped protected my.package.MyProducer.obtainPrincipal()], Built-in Bean [java.security.Principal] with qualifiers [@Default]]]
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:278)
at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244)
at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107)
at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127)
at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
したがって、問題は、CDIのデフォルトの組み込み型を置き換える方法はありますか?
なぜこれが必要なのかを理解するために、私のプロジェクトはJAASからApacheShiroに切り替えています。注入されたプリンシパルに基づいて何かを実行する既存のコードが大量にあります。ただし、Web環境のShiroは、HttpServlet要求/応答のみをラップし、適切なセキュリティ関連のメソッドをオーバーライドします。ただし、それはCDIに伝播されません。この場合、CDIは常に匿名のプリンシパルを返します。
アップデート 私も次のことを試しました:
my.package;
import javax.security.Principal;
@Alternative
public class MyPrincipal implements Principal {
...
@Override
public String getName() {
return getMyPrincipalName();
}
}
次に、beans.xmlで代替を有効にします。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>my.package.MyPrincipal</class>
</alternatives>
</beans>
この場合、デプロイメントエラーはありませんが、注入されたプリンシパルはデフォルトのプリンシパルであり、有効な代替ではありません。