0

Apache ShiroをSpring Web MVCプロジェクトに統合しようとしていますが、適切なBean定義に問題があります。あなたが見ることができるように、私はautowire = "byName"とここに定義されたadminRealm Beanを持ってNullPointer例外を与えるSpring autowire byName

<?xml version='1.0' encoding='UTF-8' ?> 
<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:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>/WEB-INF/jdbc.properties</value>  
       <value>/WEB-INF/wmsauth.properties</value> 
      </list>  
     </property>    
    </bean>   

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean>  

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="packagesToScan" value="com.smth.smth.model"/> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.current_session_context_class">thread</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property>  
    </bean> 

    <bean id="shiroFilter" class= "org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
     <property name="securityManager" ref="securityManager"/> 
     <property name="loginUrl" value="/login.jsp"/> 
     <property name="successUrl" value="/login/index"/>   
     <property name="filterChainDefinitions"> 
      <value> 
       /login.jsp = authc     
       /login/** = authc 
       /admin/** = authc 
       /logout.htm = logout 
      </value> 
     </property> 
    </bean>   

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">    
     <property name="realm" ref="adminRealm"/> 
     <property name="cacheManager" ref="cacheManager"/> 

    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> 

    <bean id="adminRealm" class="com.smth.smth.model.admin.AdminRealm" autowire="byName">   
     <property name="credentialsMatcher" ref = "sha256Matcher"/> 
     <property name="authenticationQuery" value = "SELECT password, salt FROM admin WHERE email = ?"/> 
     <property name="permissionsLookupEnabled" value = "true"/> 
     <property name="userRolesQuery" value = "SELECT role_name FROM admin_role WHERE email = ?"/> 
     <property name="permissionsQuery" value = "SELECT permission FROM roles_permission WHERE role_name = ?"/> 
     <property name="dataSource" ref = "dataSource"/>  
    </bean> 

    <bean id="sha256Matcher" class="org.apache.shiro.authc.credential.Sha256CredentialsMatcher" > 
     <property name="storedCredentialsHexEncoded" value = "false"/> 
     <property name="hashIterations" value = "1024"/> 
    </bean> 

    <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" /> 

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
     <property name="maxUploadSize" value="10000000"/> 
    </bean>  
</beans> 

:ここに私のapplicationContext.xmlをです。次のように

AdminRealmクラスは次のとおりです。ここで

package com.smth.smth.model.admin; 

import com.smth.smth.service.AdminService; 
import org.apache.shiro.authc.AuthenticationException; 
import org.apache.shiro.authc.AuthenticationInfo; 
import org.apache.shiro.authc.AuthenticationToken; 
import org.apache.shiro.authc.SaltedAuthenticationInfo; 
import org.apache.shiro.authc.UsernamePasswordToken; 
import org.apache.shiro.realm.jdbc.JdbcRealm; 
import org.springframework.beans.factory.annotation.Autowired; 

public class AdminRealm extends JdbcRealm { 

    @Autowired 
    AdminService adminService; 

    @Override 
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  
     UsernamePasswordToken userPassToken = (UsernamePasswordToken) token; 
     final String username = userPassToken.getUsername(); 

     if (username == null) { 
      System.out.println("Username is null."); 
      return null; 
     }    
     final Admin admin = adminService.getByEmail(username); 

     if (admin == null) { 
      System.out.println("User does not exist with principal: [" + username + "]"); 
      return null; 
     } 
      SaltedAuthenticationInfo info = new AdminAuthInfo(username, admin.getPassword(), admin.getSalt()); 

     return info; 
    } 
} 

私たちは、私がapplicationContext.xmlをでの構成を通じて春の依存性注入によって処理されるように期待していた@AutowiredあるAdminService持っているが、私はjava.lang.NullPointerExceptionを得続けますadminService.getByEmail(username);。どんな情報でも大歓迎です。

コンポーネントのスキャンに問題はありません。私のdispatcher-servletは次のようになります。

<?xml version='1.0' encoding='UTF-8' ?>  
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="com.smth.smth"/> 
    <mvc:resources mapping="/resources/**" location="/resources/" /> 
    <mvc:annotation-driven/>   

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="mappings"> 
      <props> 
       <prop key="index.htm">indexController</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
      p:prefix="/WEB-INF/jsp/" 
      p:suffix=".jsp" /> 

    <bean name="indexController" 
      class="org.springframework.web.servlet.mvc.ParameterizableViewController" 
      p:viewName="index" /> 

</beans> 

答えて

0

AdminService Beanはスプリングコンテキストに登録されていません。 context.xmlに追加するか、注釈で宣言してください。

+0

私はアノテーションで宣言しており、他のコントローラクラスでうまく動作しています。 –

1

adminService設定者がありますか?そうでない場合は、setAdminService()を追加してもう一度お試しください。

ここ

が基準である: ビーン定義はつまり(名前でautowireするように設定され、それがマスター プロパティが含まれている場合、例えば Spring Reference - Autowiring collaborators

、それは)..(setMasterを有しますメソッド)では、Springは という名前のbean定義を探し、それを使ってプロパティを設定します。

+0

ここに回答の重要な部分を貼り付けてください。 – krishan

+1

@krishan、ありがとうございました – Daniel

関連する問題