当前位置: 首页 > 知识库问答 >
问题:

重写内置的主体Bean

郑理
2023-03-14

在JavaEE6中,有一个内置的bean类型javax。安全Principal可供注入,如@injectprincipal

这是默认情况,我想知道是否有办法改变它,比如说,提供一个生产者方法。

目前,编写生产者方法将导致部署异常。

示例制作人:

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();
    }

}

然后在bean中启用替代方案。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>

在这种情况下,没有部署错误,但注入的主体仍然是默认的,而不是我启用的替代方案。


共有1个答案

郑衡
2023-03-14

Weld的人帮了我一把。我的部署结构类似于:

-- app.war
  |-- module0.jar (beans.xml)
  |-- module1.jar (beans.xml)
  |-- ...
  |-- other-lib.jar

但是在CDI 1.0中,只能为每个bean存档提供替代方案

<alternatives>
    <class>my.package.MyPrincipal</class>
</alternatives>

每个豆子里都有。xml让一切都能正常工作。

 类似资料:
  • 我试图在测试配置中使用@primary声明的测试期间覆盖Spring bean。一个声明位于src/main/java路径中,另一个声明位于src/test/java路径中。 从日志来看: o.s.b.f.s.DefaultListableBeanFactory-用不同的定义重写bean“SQS ConnectionFactory”的bean定义:替换[根bean:class[null];scop

  • 我正在开发一个web应用程序,并在Firebase主机上托管所有文件。 到目前为止,我的页面URL看起来像

  • 问题内容: 当我探索问题的解决方案Python Use User Defined String Class时 ,我遇到了这种奇怪的python行为。 输出: 覆盖过去! 现在,如何才能恢复python解释器中的原始行为? 问题答案: 只需删除覆盖: 这将从字典中删除该名称,从而使搜索回落到内置函数。 您也始终可以通过模块直接引用内置函数: 在Python 3中,该模块已重命名为。

  • 我使用共享服务在2个独立组件之间传递数据。当我在共享服务中使用主题时,我无法在订阅组件的html中看到订阅的数据,但可以在订阅后在控制台中看到它。然而,如果我使用行为主题,它工作得很好。有人能解释一下原因吗? sharedservice.ts: 组件2.ts: 上面的控制台在两种情况下都打印出消息的值,但是没有以html的形式呈现主题。

  • 这个Redis集群有240个节点(120个主节点和120个从节点),并且可以长期工作。但现在它得到一个主从开关几乎几个小时。 我从Redis服务器得到一些日志。 下面是这个集群的配置。 在我的选项中,aof重写不会影响Redis主线程。但这似乎使该节点无法响应其他节点的ping。

  • 问题内容: 在我的桌子上,我有100条记录。然后,我删除了所有记录,现在我想重新开始输入数据,我看到我的主键不是从1开始,而是从101开始, 有什么办法可以重置主键? 我正在使用MySQL管理员帐户。 问题答案: