为什么我在Enum值上得到java.lang.NoSuchFieldError:

时间:2015-01-14 15:45:25

标签: java web-applications enums weblogic11g nosuchfieldexception

我在自己制作的罐子里面有一个Enum。这个jar是第二个jar的依赖,它使用枚举值。

现在,第二个jar是一个日志框架,而在这种情况下,第一个jar是日志框架的模型类。

我正在尝试将此日志记录框架实现到我所创建的Web应用程序中。长话短说,它仍然需要一些工作,但我遇到了一个问题。框架配置初始化中的错误被捕获为异常,并调用方法。此方法将Enum值作为其参数之一。但是,我在这个枚举上得到了一个java.lang.NoSuchFieldError。

Enum值是ERROR,所以我认为这可能是巧合。但当我将其更改为BABYLOVE时,错误消息也会更改。

我已经检查了类/枚举名称中的冗余和/或可能的重叠,但我找不到任何内容。

订购顺序:

  1. Web App要求初始化logging-framework(直接依赖)
  2. logging-framework在加载自己的配置时出现问题,并引发异常
  3. 有异常处理,并调用方法注册错误
  4. 使用多个参数调用该方法,其中一个是logging-framework-model.jar的枚举值,它是Web应用程序的传递依赖
  5. 网络应用会抛出异常

    java.lang.NoSuchFieldError: BABYLOVE
    at logging.framework.Constants.<clinit>(Constants.java:52)
    at logging.framework.Logger.<init>(Logger.java:60)
    at logging.framework.LogContext.getLoggerFromContext(LogContext.java:95)
    at logging.framework.LogContext.getCurrent(LogContext.java:48)
    at action.navigation.CalendarElementEditorAction.execute(CalendarElementEditorAction.java:39)
    Truncated. see log file for complete stacktrace
    
      

  6. 常数,第51-52行:

    public static final Event ConfigValidationFailed = 
    EventLogHelper.getEvent(EventLogSource.LoggingFramework, EventLogEntryType.BABYLOVE");
    

    EventLogEntryType:

    @XmlType(name = "EventLogEntryType")
    @XmlEnum
    public enum EventLogEntryType {
    
    //for test purposes, should be removed. This variable is given a name that can not be confused with standard names in error messages, like Error and Warning can.
    @XmlEnumValue("BabyLove")
    BABYLOVE("BabyLove"),
    
    @XmlEnumValue("Error")
    ERROR("Error"),
    @XmlEnumValue("Warning")
    WARNING("Warning"),
    @XmlEnumValue("Information")
    INFORMATION("Information"),
    @XmlEnumValue("SuccessAudit")
    SUCCESSAUDIT("SuccessAudit"),
    @XmlEnumValue("FailureAudit")
    FAILUREAUDIT("FailureAudit");
    
    
    
    private final String value;
    
    EventLogEntryType(String v) {
        value = v;
    }
    
    public String value() {
        return value;
    }
    
    public static EventLogEntryType  fromValue(String v) {
        for (EventLogEntryType c: EventLogEntryType .values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }
    

    我不知道它是否重要,但我使用maven2来处理我的依赖。

1 个答案:

答案 0 :(得分:1)

我被告知检查我的依赖项的版本是否存在不匹配,并且在检查了战争的内容后,我发现这是问题所在。

我的webapp是两个非常相似的一个,它们都依赖于包含一些基本模型和业务逻辑类的jar。我之前已将日志框架(版本1)添加到该项目的pom.xml中。因此,日志框架1.0是Web应用程序的传递依赖,而日志框架2.0是Web应用程序的直接依赖。我猜测直接依赖关系优先于传递依赖关系,因此2.0是打包到我的战争中的那个。但是,由于日志框架由一个框架(直接依赖)和一组模型类(传递依赖)组成,因此war与日志框架模型版本1.0打包在一起。

在我解压缩战争之后,发现这一点,找到错误导入的位置是一个非常简单的过程,我最终只得到了完整集的日志框架版本2.0。