1

我有 confluence 插件项目,我想使用 spring 注释为我的服务类实现事务,但我收到错误:

[INFO] [talledLocalContainer]2014-05-23 13:12:06,298 ERROR [main][plugin.osgi.factory.OsgiPlugin] enableInternal Detected an error (BundleException) enabling the plugin 'mypackage'
: Unresolved constraint in bundle mypackage [176]: Unable to resolve 176.0: missing  requirement [176.0] package; (&(package=org.springframework.jdbc.datasource.DataSour
ceTransactionManager)(version>=2.5.6.SEC02)).  This error usually occurs when your      plugin imports a package from another bundle with a specific versio
n constraint and either the bundle providing that package doesn't meet those version   constraints, or there is no bundle available that provides the specified package.
For more details on how to fix this, see https://developer.atlassian.com/x/mQAN

这是代码:

我的配置文件.xml

...
<!-- TRANSACTIONS CONF -->
    <!-- enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="txManager"/>

    <!-- PlatformTransactionManager -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!-- TRANSACTIONS CONF END-->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="url" value="${db.url}" />
    <property name="driverClassName" value="${db.driver}" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.password}" />
</bean> 

<bean id="transactionAwareDataSource"
    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource" />
</bean>

<bean id="connectionProvider" class="org.jooq.impl.DataSourceConnectionProvider">
    <constructor-arg ref="transactionAwareDataSource" />
</bean>
...

服务类

@Service
@Transactional
public class AdminServiceImpl implements AdminService<ProjectRecord> {

private IDao<ProjectRecord> dao;

@Autowired
public AdminServiceImpl(IDao<ProjectRecord> dao) {
    super();
    this.dao = dao;
    // TODO Auto-generated constructor stub
}

@Override
public void delete(Long id) {
    // TODO Auto-generated method stub
    dao.delete(id);
}

@Override
public void changeName(Long id, String newName) {
    // TODO Auto-generated method stub
    dao.update(dao.findbyId(id));
}

}

pom.xml

...
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>2.5.6.SEC02</version>
        <scope>provided</scope>
</dependency>
...
...
<plugin>
            <groupId>com.atlassian.maven.plugins</groupId>
            <artifactId>maven-confluence-plugin</artifactId>
            <version>${amps.version}</version>
            <extensions>true</extensions>
            <configuration>
                <productVersion>${confluence.version}</productVersion>
                <productDataVersion>${confluence.data.version}</productDataVersion>
                <instructions>
                    <Import-Package>
                        org.springframework.jdbc.datasource.DataSourceTransactionManager;version="2.5.6.SEC02"
                    </Import-Package>
                </instructions>
            </configuration>
        </plugin>
        <plugin>

在我的引用库项目中,我有一个适当的库:

在此处输入图像描述

那是我做错了吗?

4

1 回答 1

0

我有一个类似的问题,不幸的是,使用语句解决它并没有产生正确的解决方案。添加导入语句时,您需要指定项目使用的所有依赖项,而不仅仅是您似乎缺少的依赖项。似乎指定导入将关闭自动生成的清单条目。但是即使在你指定了所有的导入之后,你也会发现你的 spring 上下文已经停止被读取!我通过删除 import-package 并创建了一个名为 OsgiImports 的类来规避这个问题,我在其中保存了一个我想由容器导入的类的表。这使得自动生成的清单获取所有需要的依赖项。即这样的:

package com.rulefinancial.uservoice;

import org.aopalliance.aop.Advice;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.aop.SpringProxy;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;

public class OsgiImports {
    public Class<?>[] imports = {
            PropertyPlaceholderConfigurer.class,
            BasicDataSource.class,
            DataSourceTransactionManager.class,
            TransactionAwareDataSourceProxy.class,
            SpringProxy.class,
            Advised.class,
            Advice.class
    };

}
于 2014-05-26T12:00:51.883 回答