簡體   English   中英

靜態編織eclipselink jpa與spring和tomcat

[英]static weaving eclipselink jpa with spring and tomcat

我正在嘗試使用maven使用Eclipselink + Spring + JPA實現靜態編織。 我已經用Java配置(沒有context.xml)配置了spring項目。 我嘗試了以下操作:

  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文檔中的說明添加了以下插件:

如下:

              <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中列出的實體已成功編織。 但是,當我向雄貓部署戰爭時,它會出現以下異常:

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的入門項目

編輯:我想我找到了你的問題

   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文件是否被static-weaving-plugin擴展了? 編織的文件是否在您的tomcat文件夾中? tomcat wtpwebapps-folder中的文件正確嗎? (有時同步只是失敗)您是否使用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運行應用程序,是否可以正常工作?

我也嘗試使用maven使用Eclipselink + Spring + JPA實現靜態編織。 一切都工作得很好,除了訪存類型永遠不會工作懶惰 最后,我發現這個文章與工作對我來說完美的解決方案。
解決的辦法是向我的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也建議。
靜態編織的唯一問題是,即使您願意,也無法獲取渴望的東西。 因此,我不是在使用編織,而是批量或聯接獲取

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM