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

两个具有相同类名(不同包)的Spring Service Bean即使使用限定符也会抛出错误

东郭自珍
2023-03-14

我有以下...

package package1;

@Service
@Qualifier("kb")
public class UserService {
...
}

package package2;

@Service
@Qualifier("user")
public class UserService {
...
}

@Autowired
@Qualifier("user")
package2.UserService p2;
@Autowired
@Qualifier("kb")
package1.UserService p1;

但是当我试着运行这个时,我得到。。。

组织。springframework。豆。工厂BeanDefinitionStoreException:未能分析配置类[boot.Application];嵌套的异常是org。springframework。上下文注释。ConflictingBeanDefinitionException:为bean类[package1.userService]指定的注释bean名称“userService”与相同名称和类[package2.userService]的现有不兼容bean定义冲突

我如何拥有2个同名服务?

共有2个答案

公西马鲁
2023-03-14

在这里,您需要理解@Qualifier的用途。

当您创建多个相同类型的bean并且只想将其中一个连接到属性时,可能会出现这种情况。在这种情况下,您可以使用@Qualifier注释和@Autowired,通过指定要连接的确切bean来消除混淆。

您正在尝试创建两个名称相同但包不同的类。为此,您需要将服务的名称指定为@service注释的值参数,以便区分这两种类型:

package package1;

@Service("kb")
public class UserService {
...
}

package package2;

@Service("user")
public class UserService {
...
}

@Autowired
@Qualifier("user")
package2.UserService p2;
@Autowired
@Qualifier("kb")
package1.UserService p1;
慕容坚
2023-03-14

从类中删除@Qualifer,仅在自动连接时使用@Qualifer

@Service("kb")
public class UserService {
...
}

package package2;

@Service("user")
public class UserService {
...
}

来自@Qualifier javadoc

**
 * This annotation may be used on a field or parameter as a qualifier for
 * candidate beans when autowiring. It may also be used to annotate other
 * custom annotations that can then in turn be used as qualifiers.
 */
 类似资料:
  • 问题内容: 如何在不同的程序包中访问两个具有相同名称的类? 和 所有这些都在同一个班级 谢谢。 问题答案: 您将必须导入另一个,您将编写完全合格的路径 例如在您的代码中:

  • 问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I

  • 我用的是spring soap ws。 我有以下对应于复杂类型的JAXB域类 我有以下带有@XmlRegistry注释的类 以下是endpoint 当我发出 Soap 请求时,我正在使用 soap 请求中的终结点中给出NAMESPACE_URI。 在这里,在这种情况下,我得到以下回应 如果我使用"超文本传输协议://命名空间/url"作为NAMESPACE_URI在endpoint和肥皂请求我得到

  • 我有两个类,它们具有相同的类名并使用相同的包名。但是,这两个类文件位于不同的目录中。这两个类之间的另一个不同之处是,每个类中都有其他类中没有的方法。本质上,我想将这些方法拆分为两个使用相同名称但不同文件夹的单独文件。 理论上,我认为这是可能的,因为Java编译器在构建输出时确实维护了目录结构。所以在运行时,如果在类中调用了一个方法,Java可能会在任何一个文件中找到该方法。 这可能吗?我使用的是I

  • 问题内容: 我在xcode 9.3和xcode 10 beta 3操场上都运行此代码 即使两者都使用Swift 4.1,但它们却给了我不同的结果 在 xcode 9.3 上,数组的大小为 4 在 xcode 10 beta 3 上,数组的大小为 0 我一点都不明白。 问题答案: 这是获取所有枚举值序列的一种未公开的方法,并且仅在偶然的早期Swift版本中才起作用。它依赖于枚举值的哈希值是从零开始的

  • 我有一个react-native应用程序,带有react-native购买和react-native指示包。他们都有进口品 由:java.lang.runtimeException:com.android.builder.dexing.dexarchivEmergerException:合并dex归档时出错:在https://developer.android.com/studio/build/d