2015-12-19 8 views
5

के लिए अपवाद फेंकता है I this tutorial का पालन कर रहा हूं। मैं डेटाबेस प्रश्नों के लिए हाइबरनेट का उपयोग करना चाहता हूं। मैंने कोड कॉन्फ़िगर किया लेकिन अपवाद के बाद फेंक दिया गया।वसंत स्प्रिंग सिक्योरिटी का उपयोग करने के लिए अपरिभाषित बीन

मैंने बीन को spring-security.xml और my-servlet.xml में परिभाषित किया लेकिन अभी भी कोई परिणाम नहीं है।

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myMemberDetailsService' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:570) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1114) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:279) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320) 
    ... 93 more 

MemberRepository

public class MemberRepositoryImpl implements MemberRepository { 

    SessionFactory sessionFactory; 

    @SuppressWarnings("unchecked") 
    @Override 
    public Member findByUserName(String username) { 

     List<Member> members = new ArrayList<Member>(); 
     members = sessionFactory.getCurrentSession() 
       .createQuery("from Member where username=?") 
       .setParameter(0, username).list(); 

     if (members.size() > 0) { 
      return members.get(0); 
     } else { 
      return null; 
     } 
    } 

} 

MyMemberDetailsService

public class MyMemberDetailsService implements UserDetailsService { 

    private MemberRepository memberRep; 

    @Override 
    public UserDetails loadUserByUsername(final String username) 
      throws UsernameNotFoundException { 

     Member member = memberRep.findByUserName(username); 
     HashSet<String> roles = new HashSet<String>(); 
     roles.add("ROLE_MEMBER"); 
     List<GrantedAuthority> authorities = buildUserAuthority(roles); 

     return buildUserForAuthentication(member, authorities); 

    } 

    // Converts com.mkyong.users.model.User user to 
    // org.springframework.security.core.userdetails.User 
    private User buildUserForAuthentication(Member member, 
      List<GrantedAuthority> authorities) { 
     return new User(member.getUsername(), member.getPassword(), 
       member.isEnabled(), true, true, true, authorities); 
    } 

    private List<GrantedAuthority> buildUserAuthority(Set<String> userRoles) { 

     Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>(); 

     // Build user's authorities 
     for (String userRole : userRoles) { 
      setAuths.add(new SimpleGrantedAuthority(userRole)); 
     } 

     List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(
       setAuths); 

     return Result; 
    } 

} 

मेरी-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http:/www.springframework.org/schema/beans 
    http:/www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http:/www.springframework.org/schema/aop 
    http:/www.springframework.org/schema/aop/spring-aop-3.0.xsd 
    http:/www.springframework.org/schema/tx 
    http:/www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http:/www.springframework.org/schema/context 
    http:/www.springframework.org/schema/mvc"> 


    <context:annotation-config /> 
    <mvc:annotation-driven /> 
    <mvc:view-controller path="/index" /> 
    <mvc:view-controller path="/" view-name="index" /> 
    <mvc:view-controller path="/signin" /> 



    <mvc:resources mapping="resources/**" location="resources/" /> 
    <context:component-scan base-package="com.myProject" /> 
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.tiles3.TilesViewResolver" /> 
    <bean id="tilesConfigurer" 
     class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean> 


    <bean id="memberRep" class="com.myProject.repository.MemberRepositoryImpl"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 


    <bean id="myMemberDetailsService" class="com.myProject.service.MyMemberDetailsService"> 
     <property name="memberRep" ref="memberRep" /> 
    </bean> 

    <!-- Hibernate Config --> 

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:8889/myProject" /> 
     <property name="username" value="jack" /> 
     <property name="password" value="jack" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     depends-on="dataSource"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.myProject.model" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.use_sql_comments">true</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean> 

    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
     <tx:attributes> 
      <tx:method name="get*" read-only="true" /> 
      <tx:method name="find*" read-only="true" /> 
      <tx:method name="*" /> 
     </tx:attributes> 
    </tx:advice> 

    <aop:config> 
     <aop:pointcut id="userServicePointCut" 
      expression="execution(* com.myProject.service.*Service.*(..))" /> 
     <aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointCut" /> 
    </aop:config> 

    <!-- End Hibernate Config --> 
</beans> 

वसंत-security.xml

<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 



    <beans:import resource='login-service.xml' /> 
    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/" access="permitAll" /> 
     <intercept-url pattern="/member**" access="hasRole('ROLE_MEMBER')" /> 
     <intercept-url pattern="/signin" access="permitAll" /> 


     <access-denied-handler error-page="/403" /> 
     <form-login login-page="/signin" default-target-url="/index" 
      authentication-failure-url="/signin?error" username-parameter="username" 
      password-parameter="password" /> 
     <logout logout-success-url="/login?logout" /> 
     <!-- enable csrf protection --> 
     <csrf /> 
    </http> 
    <authentication-manager> 
     <authentication-provider user-service-ref="myMemberDetailsService"> 
      <password-encoder hash="bcrypt" /> 


     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 
+1

तरह लग रहा है की तरह अपने मेरी-servlet.xml फ़ाइल भी भरी हुई (web.xml में परिभाषित किया जाना चाहिए) – kryger

+0

@kryger मैं परिभाषित सर्वलेट-मानचित्रण –

+0

नहीं है आपको 'myMemberDetailsService' को बीन के रूप में परिभाषित करने की आवश्यकता है। क्या आप प्रोजेक्ट में उदाहरण से वसंत-डेटाबेस.एक्सएमएल हैं? –

उत्तर

4

मैं सिर्फ ट्यूटोरियल पढ़ सकते हैं और मैंने देखा कि यह web.xml विन्यास के बारे में कुछ भी उल्लेख नहीं था, इसलिए मैं यह देखने के लिए कि यह कैसे कॉन्फ़िगर किया गया था इसे डाउनलोड किया।

आपने कहा, आपने दोनों स्थानों पर my-servlet और spring-security परिभाषित करने का प्रयास किया है लेकिन यह काम नहीं किया।

खैर मुझे लगता है कि यह विन्यास की एक समस्या है तो (मैं नाम आप अपने प्रश्न में प्रयोग किया जाता है प्रयोग किया जाता है, लेकिन कृपया यह अगर वहाँ कुछ गड़बड़ है देखने के लिए बाहर की जाँच) के बाद के रूप में अपने web.xml परिवर्तित करने का प्रयास करें:

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/my-servlet.xml, 
      /WEB-INF/spring-security.xml 
     </param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

और वर्तमान अगर आपके वैश्विक <context-param> के लिए contextConfigLocation परम को हटा दें।

यदि यह काम नहीं करता है तो मैं आपको ट्यूटोरियल के समान कॉन्फ़िगरेशन का उपयोग करने की सलाह दूंगा, कहने के लिए, न्यूनतम एमवीसी कॉन्फ़िगरेशन my-servlet.xml में छोड़ दें और शेष बीन्स को अलग संदर्भ में कॉन्फ़िगर करें।

उम्मीद है कि यह मदद करता है!

0

UserDetailsServicesecurityxml में समस्या का समाधान होगा।

आपके spring-security.xml में MyMemberDetailsService कार्यान्वयन परिभाषा शामिल है।

<beans:bean class="your.package.MyMemberDetailsService" 
    id="myMemberDetailsService" /> 

मैं देख रहा हूँ कि आप अपने spring-security.xml में login-service.xml शामिल कर रहे हैं। इसलिए login-service.xml में उपयोगकर्ता सेवा बीन को परिभाषित करने से समस्या हल हो जाएगी।

0

ट्यूटोरियल के अनुसार, web.xml में आपके वसंत कॉन्फ़िगरेशन xml का संदर्भ होना चाहिए।

वेब।एक्सएमएल

<servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>*</url-pattern> 
    </servlet-mapping> 

एमवीसी-डिस्पैचर-सर्वलेट एक्सएमएल में अन्य सभी एक्सएमएल का आयात होना चाहिए।

MVC-डिस्पैचर-सर्वलेट एक्सएमएल दिखेगा

<?xml version="1.0" encoding="UTF-8"?> 

    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     ..."> 

     <import resource="my-servlet.xml" /> 
     <import resource="spring-security.xml" /> 
     ... 
    </beans> 
संबंधित मुद्दे