我正在研究如何在Spring中注入Map<Integer, CustomEnumType>
,而不是使用app-context.xml
但是使用@Bean(name = "customMap")
注释。当我尝试通过
@Inject
Map<Integer, CustomEnumType> customMap;
它抱怨,因为显然它找不到类型CustomEnumType
的任何可注射依赖项。但是CustomEnumType
只是一个枚举,而不是应该注入的东西。我只是想将它用作我的地图的value
类型。
一种解决方案是创建一个可注入的包装器对象,它将Map
作为一个字段,但我希望避免不必要的混乱。看到Map
被注入的类型,它也更干净,更易读。
答案 0 :(得分:0)
不要尝试注入枚举,而是尝试注入int值。
枚举确实是类,但是,您无法创建它们的实例/对象。他们的构造函数访问修饰符只能是private
,这是另一个证明为什么你不能拥有它们的实例。
话虽如此,你不能拥有Enum的豆子,因为没有办法建造它们。
解决方案是给你的枚举中的每个成员一个int值,然后只注入那个int值。
例如:
public enum Color {
white(0),
black(1);
private int innerValue;
private Color(int innerValue) {
this.innerValue = innerValue;
}
public int getInnerValue() {
return innerValue;
}
}
现在,让我们说我要注入值1,这在我的枚举中是黑色的。通过其构造函数 到另一个类 。然后我的构造函数将如下所示:
public Canvas(String id, int color) {
this.id = id;
this.color = Color.getColorByInt(color);
}
现在,让我们说包含此内容的xml配置文件:
<bean id="myCanvas" class="com.my.package.Canvas">
<constructor-arg name="id" value="9876543" />
<constructor-arg name="color" value="1" />
<!-- This is the black value for myCanvas bean -->
</bean>
答案 1 :(得分:0)
我找到了解决方案。显然,@Inject
和@Autowired
无法正确找到他们需要使用的@Bean
方法的类型。但是,使用@Resource(name = "customMap")
一切都很完美。即使值是枚举,地图创建也没有问题。使用的方法是:
@Bean(name = "customMap")
public Map<Integer, CustomEnumType> getCustomMap() {
Map<Integer, CustomEnumType> map = new HashMap<>();
map.put(1, CustomEnumType.type1);
map.put(2, CustomEnumType.type2);
//...
return map;
}
并使用
注入@Resource(name = "customMap")
Map<Integer, CustomEnumType> customMap;
请注意,CustomEnumType
没有定义构造函数,也没有为枚举赋值。在我的情况下,从一开始就不可能这样做,因为CustomEnumType
类是我们无法编辑的依赖项。