因此,我在我的 Hibernate 对象之一中创建此枚举,而不是在数据库中创建 LUT:
@Entity
@Table(name = "Foo", schema = "dbo")
public class Foo
{
private static final long serialVersionUID = 2L;
int idFoo;
String name;
String type;
public Foo()
{
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "idFoo", unique = true, nullable = false)
public int getID() { return idFoo; }
public void setID(int idFoo) { this.idFoo = idFoo; }
@Column(name="name", nullable=false, length=50)
public String getName() { return this.name; }
public void setName(String aString) { this.name = aString; }
@Column(name="type", nullable=false, length=8)
public String getType() { return this.type; }
public void setType(String aString) { this.type = aString; }
public static enum FooType
{
First,
Middle,
Last;
public boolean isLast() { return this == Last; }
}
}
我一生都无法让 Spring 喜欢它。无论我做什么,我都会收到以下错误消息:
Caused by: java.lang.NoSuchMethodException: com.bar.orm.FooType.<init>()
at java.lang.Class.getConstructor0(Class.java:2810) [rt.jar:1.7.0_45]
at java.lang.Class.getDeclaredConstructor(Class.java:2053) [rt.jar:1.7.0_45]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:67) [org.springframework.beans-3
.1.1.RELEASE.jar:3.1.1.RELEASE]
... 23 more
在示例中,第一行将引用 Foo.$1
,而不是指定的枚举。
我尝试过的事情:
- 从声明中删除静态
- 给它一个构造函数(不能是公共(public)的,但 Spring 可以通过反射看到包私有(private))
- 将其移至单独的类文件
- 将其更改为静态最终字符串并移至 JDK 1.7 以使用
switch(String)
只有最后一个有效。 Spring 限制我使用 Java 语言中非常酷的部分,这真的很糟糕。但这可能不是 Spring 的错,不是吗?我做错了什么?我如何编写上面的枚举,以便 Spring 要么不理会它,要么让我使用它?
编辑:
目前,工作解决方案包括以下内容:
- 每个枚举都位于其自己的类文件中,而不是保留其值的对象的内部类。 (这两种方法都有有效的设计原则,但总而言之,在重量上基本相同。)
- 枚举被添加到
context:exclude-filter
标记中的context:component-scan
中,其正则表达式几乎等同于类名。所有其他枚举都位于也被排除的包中。 - 当在
switch
语句中使用枚举时,javac 使用内部类命名方案 ( more info ) 为其创建一个特殊类。由于交换机使用枚举,因此还必须将生成的类添加到排除过滤器中:“MyClass.1”等。
我正在编辑这个问题,因为我仍然不敢相信这不是对 Spring 缺乏经验的结果(最后一个荒谬的要求刚刚把船翻了!),仍然希望得到一个答案,显示“正确”的方式让Spring 利用这个核心语言功能做了正确的事情!
最佳答案
我会将枚举移动到它自己的文件中,以便您可以在其他地方访问它而无需指定您的类。
public enum FooType{
First,
Middle,
Last
}
将 @Enumerated(EnumType.STRING) 添加到您对枚举的使用
@Enumerated(EnumType.STRING)
private FooType type;
关于java - 在 Spring MVC 应用程序中使用 Java 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329410/