【问题标题】:static weaving eclipselink jpa with spring and tomcat用spring和tomcat静态编织eclipselink jpa
【发布时间】:2015-04-13 04:02:10
【问题描述】:

我正在尝试使用 Maven 使用 Eclipselink+Spring+JPA 实现静态编织。我已经用 Java 配置配置了我的 spring 项目,没有 context.xml。我尝试了以下事情:

  1. 在 persistence.xml 中:

添加了以下编织规范。

<property name="eclipselink.weaving" value="static" />
  1. 在 DBConfig.java 中,我已经配置了 bean

如下:

 @Bean()
    public DataSource getDataSource() {
        BoneCPDataSource ds = new BoneCPDataSource();
        log.debug("Driver Name : " + driverClassName);
        try {
            Class.forName(driverClassName);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        log.debug("DB Url : " + url);
        ds.setDriverClass(driverClassName);
        ds.setJdbcUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setMaxConnectionsPerPartition(5);
        ds.setMinConnectionsPerPartition(2);
        ds.setAcquireIncrement(2);
        ds.setDefaultAutoCommit(false);     
        Properties props = new Properties();
        props.put("eclipselink.weaving", "static");
        try {
            ds.setProperties(props);
        } catch (Exception e) {         
            e.printStackTrace();
        }
        return ds;
    }

    @Bean(name = "em")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(getDataSource());      
        em.setJpaDialect(jpaDialect());
        em.setPackagesToScan("com.cdl.hp50.model", "com.cdl.hp50.model.person");
        em.setPersistenceUnitName(persistenceUnitName);
        DatabasePlatform dp = new MySQLPlatform();
        em.setJpaVendorAdapter(getEclipseLinkJpaVendorAdapter());       
        return em;
    }
  1. 在 pom.xml 中,我按照eclipselink documentation 中的说明添加了以下插件:

如下:

              <plugin>
                    <groupId>de.empulse.eclipselink</groupId>
                    <artifactId>staticweave-maven-plugin</artifactId>
                    <version>1.0.0</version>
                    <executions>
                        <execution>
                            <phase>process-classes</phase>
                            <goals>
                                <goal>weave</goal>
                            </goals>
                            <configuration>
                                <persistenceXMLLocation>META-INF/persistence.xml</persistenceXMLLocation>
                                <logLevel>FINE</logLevel>
                            </configuration>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.eclipse.persistence</groupId>
                            <artifactId>org.eclipse.persistence.jpa</artifactId>
                            <version>${eclipselink.version}</version>
                        </dependency>
                    </dependencies>
                </plugin>

我已经明确指定使用静态(构建时间)编织。当我使用maven install 创建战争时,persistence.xml 中列出的实体已成功编织。但是当我将战争部署到 tomcat 中时,它会给出以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'em' defined in class com.cdl.hp50.config.DBConfig: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Cannot apply class transformer without LoadTimeWeaver specified
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1568)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1245)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1895)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Cannot apply class transformer without LoadTimeWeaver specified
    at org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.addTransformer(SpringPersistenceUnitInfo.java:80)
    at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:348)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:341)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564)
    ... 25 more

我已经尝试将eclipselink.weaving 设置为false。但它仍然给出同样的错误。我不知道它为什么要寻找LoadTimeWeaver。请建议我在这里缺少什么。

更新:

我已经在github上传了包含eclipselink、spring mvc、spring data jpa、sitemesh的启动项目

【问题讨论】:

    标签: java spring spring-mvc jpa eclipselink


    【解决方案1】:

    编辑:我想我找到了你的问题

       props.put("eclipselink.weaving", "static");
        try {
            ds.setProperties(props);
    

    您是否尝试将 eclipselink 属性应用于您的数据源?如果您检查我的示例 context.xml(形成下面的应用程序),则需要将 jpaPropertyMap 应用于 LocalContainerEntityManagerFactoryBean。

    所以,你应该把你的代码改成

     em.setjpaPropertyMap(props)
    

    旧答案:

    首先,对于这样的问题,一个示例项目会非常好。好吧,我为你做了,可以在:https://github.com/baumgartner/eclipselink-static-weaving

    还有一个坏消息:我无法重现您的问题,我的应用程序在 tomcat 7 上运行良好。

    如果静态编织插件扩展了您的 .class 文件,您是否检查过它们?编织的文件在您的tomcat文件夹中吗? tomcat wtpwebapps-文件夹中的文件是否正确? (有时同步失败) 您是否使用 JAD(java 反编译器)来反编译您的类并检查它们是否得到了增强?增强的实体如下所示:

    public class asdf.User implements java.lang.Cloneable, org.eclipse.persistence.internal.weaving.PersistenceWeaved, org.eclipse.persistence.internal.descriptors.PersistenceEntity, org.eclipse.persistence.internal.descriptors.PersistenceObject, org.eclipse.persistence.queries.FetchGroupTracker, org.eclipse.persistence.internal.weaving.PersistenceWeavedFetchGroups, org.eclipse.persistence.descriptors.changetracking.ChangeTracker, org.eclipse.persistence.internal.weaving.PersistenceWeavedChangeTracking, org.eclipse.persistence.internal.weaving.PersistenceWeavedRest {
    

    如果您部署战争,您的应用程序是否有效?如果您从 IDE 运行您的应用程序,它是否有效?

    【讨论】:

    • 非常感谢您指出问题。 em.setjpaPropertyMap(props) 像魅力一样工作。我在错误的地方设置属性。非常感谢。这个解决方案真的救了我。
    【解决方案2】:

    我也尝试使用 maven 使用 Eclipselink+Spring+JPA 实现静态编织。除了 fetch 类型从不工作 Lazy 之外,一切都运行良好。最后,我找到了这个article,它的解决方案非常适合我。
    解决方案是在我的 maven pom.xml 中添加一个插件。

    <plugin>
        <artifactId>eclipselink-staticweave-maven-plugin</artifactId>
        <groupId>au.com.alderaan</groupId>
        <version>1.0.4</version>
        <executions>
            <execution>
                <goals>
                    <goal>weave</goal>
                </goals>
                <phase>process-classes</phase>
                <configuration>
                    <logLevel>ALL</logLevel>
                </configuration>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>org.eclipse.persistence</groupId>
                <artifactId>eclipselink</artifactId>
                <version>${eclipselink.version}</version>
            </dependency>
        </dependencies>
    </plugin>  
    

    EclipseLink also推荐。
    我对静态编织的唯一问题是,即使您愿意,您也无法急切地获取。因此,我没有使用编织,而是batch or join fetch

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2019-07-22
      • 2012-05-30
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多