私はSpringプロジェクトでセキュリティを設定していますが、残念ながら問題が発生しました。 CustomUserDetailsService.javaのautowired userDAOがnullになるのはなぜですか?ここSpring:カスタムのUserServiceDetails実装でautowired DAOがヌルです
は、問題のコードである:
CustomUserDetailsService.java
@Service("customUserDetailsService")
@ComponentScan(basePackages="...")
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserDAO userDAO;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// userDAO is null
UserModel user = userDAO.getUserByUsername(username);
...
}
}
ばねの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">
<http pattern="/resources/**" security="none"/>
<http pattern="/login" security="none"/>
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login
login-page="/login"
default-target-url="/home"
authentication-failure-url="/login?error"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/login?logout" />
</http>
<authentication-manager>
<authentication-provider user-service-ref="customUserDetailsService">
<password-encoder ref="encoder" />
</authentication-provider>
</authentication-manager>
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
<beans:constructor-arg name="strength" value="10" />
</beans:bean>
<beans:bean id="customUserDetailsService" class="... .service.CustomUserDetailsService" />
編集:
UserDAOImpl.javaここ
public class UserDAOImpl implements UserDAO {
private JdbcTemplate jdbcTemplate;
public UserDAOImpl(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
public UserModel getUserByUsername(String username) {
String sql = "SELECT * FROM users WHERE username = '" + username + "'";
return jdbcTemplate.query(sql, new ResultSetExtractor<UserModel>() {
public UserModel extractData(ResultSet rs) throws SQLException, DataAccessException {
if (rs.next()) {
UserModel user = new UserModel();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("passwort"));
user.setEnabled(rs.getBoolean("enabled"));
return user;
}
return null;
}
});
}
}
は、Javaベースの設定ファイル内のコードスニペットです:
@Bean
public UserDAO getUserDAO() {
return new UserDAOImpl(getDataSource());
}
興味深いしかし、この構成は、ソートの動作しているようです。私は私のコントローラにUserDAOをautowireするとき、それは完全に正常に動作します:
MainController.java
@RequestMapping(value = {"", "/", "/home"})
public String homeHandler(Model model) {
// userDAO is not null, works perfectly fine and returns the UserModel-Object as expected
UserModel user = userDAO.getUserByUsername("dx");
...
}
私はすでにいくつかのQ & Aを読んで、まだ今のところは、カスタムUserDetailsServiceのマニュアルinstatiationを懸念。私のコードで何が間違っていますか?
スキャン中ですか? –
Javaの設定ですか?はい、そうです。 DAOを私のメインコントローラ(他のすべてのDAOと同じように)にテストワイヤで自動配線すると、nullではなく正常に動作します(CustomUserDetailsService.javaではnullのみです)。 –
'getUserDAO()'メソッドはどこにありますか? – sura2k