使用EclipseLink Modelgen处理器和Spring Security时如何解决CompletionFailure?

时间:2015-08-05 12:20:20

标签: java spring-security eclipselink

我试图在一个项目中使用Spring Security,我使用eclipselink作为modelgen处理器来生成静态元模型。 当我尝试这样做时,我得到奇怪的编译错误,如:

> java.lang.RuntimeException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for org.springframework.security.ldap.DefaultSpringSecurityContextSource not found

即使我不使用LDAP。如果我添加罐子,我会得到其他错误,比如缺少sl4j,缺少openid等等。 如果我用hibernate实现交换使用过的modelgen处理器,一切都会编译没有问题。

我发现了一个重现问题的最小项目:

MyEnity.java

@Entity
public class MyEntity {

    private String name;
    private Long id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}

SecurityConfig.java

public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

的build.gradle

apply plugin: 'war'
apply plugin: 'maven'

group = 'com.demo'
version = 'alpha'

sourceCompatibility = 1.8
targetCompatibility = 1.8

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

repositories {
    maven { url "http://repo.maven.apache.org/maven2" }
    maven { url "http://download.eclipse.org/rt/eclipselink/maven.repo/" }
}


dependencies {
    compile 'org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor:2.6.0'//latest stable @06.07.2015


    compile "org.springframework:spring-beans:4.1.6.RELEASE"
    compile "org.springframework:spring-core:4.1.6.RELEASE"
    compile "org.springframework:spring-web:4.1.6.RELEASE"
    compile "org.springframework:spring-context:4.1.6.RELEASE"
    compile 'org.springframework:spring-jdbc:4.1.6.RELEASE'
    compile 'org.springframework.security:spring-security-core:4.0.2.RELEASE'
    compile 'org.springframework.security:spring-security-web:4.0.2.RELEASE'
    compile 'org.springframework.security:spring-security-config:4.0.2.RELEASE'

    providedCompile 'javax:javaee-api:7.0@jar'
}

一旦我删除

a)来自MyEntity的@Entity

b)从Security Config

扩展WebSecurityConfigurerAdapter

c)使用compile 'org.hibernate:hibernate-jpamodelgen:4.3.10.Final' 而不是compile 'org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor:2.6.0'

一切都没有问题。

那么为什么使用eclipselink modelgen处理器会导致编译错误?

1 个答案:

答案 0 :(得分:0)

问题是EclipseLink modelgen的CanonicalModelProcessor,即使使用版本2.7.4也是如此。它作为Java Agent的工作方式来处理类路径上的所有类。在某个时候,它命中了Spring Security类(例如HttpSecurity),它间接依赖于类路径中找不到的库(通常是内部类或工厂返回类型,因为Spring设计得很好, OpenIDLoginConfigurerHttpSecurity.openidLogin()返回,并引用了OpenIDAttribute等),这时整个代理崩溃,而不是跳过类型。

问题不是特定于Spring或Spring Security,而是任何使用类路径上缺少可选依赖项的项目!

令人惊讶的是,它似乎可以在OpenJDK 11上运行,但不能在OpenJDK 8上运行。从我的角度来看,CanonicalModelProcessor有问题。最后,我将生成的元模型添加到我们的项目仓库中,并暂时删除了modelgen。

更新:我知道这不是真正的答案(如果您不能使用OpenJDK 11),但至少我想弄清楚这是EclipseLink的一个错误,没有解决方法(据我所知)。