java - 在 Spring MVC 应用程序中使用 Java 枚举?

标签 java spring spring-mvc enums

因此,我在我的 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/

相关文章:

java - gui 代码适用于 Windows 和 Linux,但不适用于 Mac

java - 对 pow 的调用是模棱两可的

java - 在 @RestController 中使用嵌套对象进行 GET 请求?

java - 在 JpaRepository 中,如果一个参数对于许多查询方法来说是通用的,那么如何在 Repository 和 Service 中尽可能地做到最好

ajax - 第二次在ajax响应中获取不同的数据

java - Spring Security自定义身份验证不起作用

java - 访问其他 fragment 数据

java - 调用 Android 相机 Intent 时可以指定使用什么视频格式吗?

java - bitronix- 无法定位当前的 JTA 事务

Spring验证相关请求参数