键[org.springframework.ldap.core.support]没有值。LdapContextSource@27bd27bd]绑定到线程[main]

键[org.springframework.ldap.core.support]没有值。LdapContextSource@27bd27bd]绑定到线程[main],spring,ldap,Spring,Ldap,我正在尝试使用Spring实现LDAP事务。我已经根据Spring文档配置了Spring xml,但是在运行程序时,我遇到了下面提到的错误: java.lang.IllegalStateException: No value for key [org.springframework.ldap.core.support.LdapContextSource@27bd27bd] bound to thread [main] at org.springframework.transaction

我正在尝试使用Spring实现LDAP事务。我已经根据Spring文档配置了Spring xml,但是在运行程序时,我遇到了下面提到的错误:


java.lang.IllegalStateException: No value for key [org.springframework.ldap.core.support.LdapContextSource@27bd27bd] bound to thread [main]
    at org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:199)
    at org.springframework.transaction.compensating.support.AbstractCompensatingTransactionManagerDelegate.doCleanupAfterCompletion(AbstractCompensatingTransactionManagerDelegate.java:122)
    at org.springframework.ldap.transaction.compensating.manager.ContextSourceTransactionManager.doCleanupAfterCompletion(ContextSourceTransactionManager.java:135)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:1011)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:877)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:411)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:114)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy11.createUser(Unknown Source)
注意:我正在尝试回滚LDAP和DB

代码段:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.apps.ldap.manager.UserManger;
import com.apps.ldap.model.UserBean;

public class SpringFrameworkLDAPClient {

    private static ApplicationContext context = null;

    public static void main(String[] args)  {
        try {

            context = new ClassPathXmlApplicationContext("conf/springldap.xml");
            UserManger userservice = (UserManger)context.getBean("userManger");
            UserBean userbean = new UserBean();
            userbean.setCommonName("Santhosh5");
            userbean.setLastName("Rajendran5");
            userbean.setEmail("rsanthoshkumarr@gmail.com");
            userbean.setFirstName("Santhosh5");
            userbean.setUserID("Santhosh5");
            userservice.createuser(userbean);

        } catch (Exception e) {
            System.out.println("Error occured " + e);
            e.printStackTrace();
        }
    }
}
用户服务

@Transactional
public void createuser(UserBean contactDTO) {

    Attributes personAttributes = new BasicAttributes();
    BasicAttribute personBasicAttribute = new BasicAttribute("objectclass");
    personBasicAttribute.add("person");
    personAttributes.put(personBasicAttribute);
    personAttributes.put("cn", contactDTO.getCommonName());
    personAttributes.put("sn", contactDTO.getLastName());

    DistinguishedName newContactDN = new DistinguishedName("ou=users");
    newContactDN.add("cn", contactDTO.getCommonName());
    ldapTemplate.bind(newContactDN, null, personAttributes);

}
XML:


传播需要新的
使用的罐子:

  • apache-commons-lang.jar
  • commons-logging-1.1.1.jar
  • ibatis-2.3.0.677.jar
  • jt400.jar
  • ldapbp-1.0.jar
  • org.springframework.aop-3.0.5.RELEASE.jar
  • org.springframework.asm-3.0.5.RELEASE.jar
  • org.springframework.beans-3.0.5.RELEASE.jar
  • org.springframework.context-3.0.5.RELEASE.jar
  • org.springframework.expression-3.0.5.RELEASE.jar
  • org.springframework.jdbc-3.0.5.RELEASE.jar
  • org.springframework.oxm-3.0.5.RELEASE.jar
  • org.springframework.test-3.0.5.RELEASE.jar
  • org.springframework.transaction-3.0.5.RELEASE.jar
  • org.springframework.web-3.0.5.RELEASE.jar
  • spring-core-3.0.4.RELEASE.jar
  • spring-ldap-1.1.2.jar
  • spring-ldap-core-1.3.2.RELEASE.jar
  • spring.jar
  • SpringUtils-0.2.jar

首先,修复您的依赖关系—它们是一团乱。您至少混合了3个spring版本(3.0.5、3.0.4和一个更老的版本,形式为spring.jar(自spring 2.5以来不再存在)。此外,您正在混合spring ldap版本。所有这些混合都是等待发生的麻烦。我强烈建议您使用Maven或Gralde之类的工具,而不是自己搜索依赖项。接下来,您将使用
@Transactional
,但使用的是古老的
TransactionProxyFactoryBean
,您应该在其中使用
谢谢Denum,我问题解决了
<bean id="contextSourceTarget" class="org.springframework.ldap.core.support.LdapContextSource">
  <property name="url" value="ldap://xxxx:389" />
  <property name="base" value="dc=xxx" />
  <property name="userDn" value="cn=xxx" />
  <property name="password" value="xxx" />
</bean>

<bean id="contextSource" class="org.springframework.ldap.transaction.compensating.manager.TransactionAwareContextSourceProxy">
  <constructor-arg ref="contextSourceTarget" />
</bean>

<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">
  <constructor-arg ref="contextSource" />
</bean>

<bean id="transactionManager" class="org.springframework.ldap.transaction.compensating.manager.ContextSourceTransactionManager">
  <property name="contextSource" ref="contextSource" />
</bean>

<bean id="contactDao" class="com.apps.ldap.daos.impl.Userservice">
 <property name="ldapTemplate" ref="ldapTemplate" />
</bean>

<bean id="myDataAccessObject" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager" ref="transactionManager" />
  <property name="target" ref="contactDao" />
  <property name="transactionAttributes">
     <props>
        <prop key="*">PROPAGATION_REQUIRES_NEW</prop>
     </props>
  </property>
</bean>