[英]MyBatis + Spring mapping, nullpointerexception on interface
我正在嘗試將mybatis集成到我的spring應用程序中。 我添加了映射配置,映射接口以及具有sql查詢的xml。
這是我的配置:
Spring xml配置:
<context:annotation-config transaction-manager="transactionManager"/>
<annotation-driven />
... some other sql datasource configuration here ...
<!-- Mybatis Spring setup -->
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<beans:property name="url" value="jdbc:mysql://localhost/appdb"/>
<beans:property name="username" value="root"/>
<beans:property name="password" value=""/>
</beans:bean>
<beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<beans:property name="dataSource" ref="dataSource" />
</beans:bean>
<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="configLocation" value="WEB-INF/mybatis/sqlmap-config.xml" />
</beans:bean>
<!-- scan for mappers and let them be autowired -->
<beans:bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<beans:property name="basePackage" value="com.project.persistence" />
</beans:bean>
sqlmap-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- changes from the defaults -->
<setting name="lazyLoadingEnabled" value="false" />
</settings>
<typeAliases>
<typeAlias type="com.project.domain.User" alias="user"/>
</typeAliases>
</configuration>
用戶類別:
package com.project.domain;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 3647233284813657927L;
private String id;
private String name = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [name=" + name + "]";
}
}
我正在使用自定義身份驗證提供程序,我想在其中使用sql查詢,該查詢使我回到那個簡單的用戶:
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) {
String name = authentication.getName();
String password = authentication.getCredentials().toString();
UserService us = new UserService(); // HERE IS THE PROBLEM ! its always null, maybe not autowired?
User user = us.getUser(name);
System.out.println("User: " + user);
boolean isAuthenticated = false;
//... do the rest of the authentication
}
}
這是UserMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.persistence.UserMapper">
<resultMap id="result" type="user">
<result property="id" column="id"/>
<result property="name" column="name"/>
</resultMap>
<select id="getUser" parameterType="String" resultType="User">
SELECT id, name
FROM bm_users
WHERE name=#{username};
</select>
<select id="getAllUser" parameterType="int" resultMap="result">
SELECT id,name
FROM bm_users;
</select>
<insert id="saveUser" parameterType="user">
INSERT INTO bm_users (id,name)
VALUE (#{id},#{name})
</insert>
<update id="updateUser" parameterType="user">
UPDATE bm_users
SET
name = #{name},
where id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM bm_users
WHERE id = #{id}
</delete>
</mapper>
這是UserService.java:
@Service
public class UserService {
@Autowired
private UserMapper usermapper;
public User getUser(String name) {
return usermapper.getUser(name);
}
}
因此,當代碼到達“ User user = us.getUser(name);”時,我得到了一個nullpointerexception。 在我的CustomAuthenticationProvider中:
java.lang.NullPointerException
com.project.service.UserService.getUser(UserService.java:16)
com.project.authentication.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:27)
org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:177)
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:211)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:105)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
所以在我看來,它並沒有自動接線。
有什么建議我應該嘗試什么?
謝謝
好的,所以我幾乎可以解決這個問題。 我不得不修改我的代碼。 看來問題出在我的服務實現上。
我遵循了這個解決方法: http : //www.javacodegeeks.com/2014/02/building-java-web-application-using-mybatis-with-spring.html
在本教程中,他們使用的是“私有StudentService studentService”。 在控制器中,但我必須使用StudentServiceImpl使其正常工作。
但是,其他有趣的事情。 這僅適用於@Controller類,不適用於我的@Component CustomAuthenticationProvider。 它應該如何工作? 如何使其在我的AuthenticationProvider中工作?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.