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

问题描述 投票:4回答:1

我试图在一个项目中使用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。如果我添加jar我会得到其他错误,比如缺少sl4j,缺少openid等等。如果我用hibernate实现交换使用过的modelgen处理器,所有编译都没有问题。

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

my E你讨厌.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;
    }

}

security config.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处理器会导致编译错误呢?

java spring-security eclipselink
1个回答
0
投票

问题是EclipseLink modelgen的CanonicalModelProcessor,即使使用的是2.7.4版本。它可以作为Java Agent使类路径上的所有类进行处理。在某些时候它会遇到一个Spring Security类(就像我的情况一样是HttpSecurity),它间接依赖于类路径上找不到的库(通常来自内部类或工厂返回类型,因为Spring设计得很好,OpenIDLoginConfigurer返回HttpSecurity.openidLogin())在我的例子中引用OpenIDAttribute等) - 此时整个代理程序崩溃而不是跳过类型。

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

令人惊讶的是,它似乎使用OpenJDK 11,但没有使用OpenJDK 8.从我的观点来看,CanonicalModelProcessor是错误的。最后,我将生成的元模型添加到我们的项目仓库中,并暂时删除了modelgen。

更新:我知道这不是真正的答案(如果你不能转向OpenJDK 11)但至少我想明确它是EclipseLink的一个错误,没有解决方法(据我所知)。

© www.soinside.com 2019 - 2024. All rights reserved.