簡體   English   中英

為什么未在控制台中引發NullPointerException?

[英]Why isn't NullPointerException thrown in the console?

我正在使用Spring MVC 3.2和Spring Security 3.1構建Web應用程序。 對於身份驗證,我實現了UserDetailsService並使用了DaoAuthenticationProvider 一切正常!

但是,我對userDetailsServiceImpl bean有一個問題:當dbUsernullNullPointerException (在dbUser.getUsername() )不會被拋出到控制台中。

package net.dntuan.training.mvc.security.authentication;

import java.util.*;

import net.dntuan.training.mvc.dao.UserDao;
import net.dntuan.training.mvc.security.Role;

import org.slf4j.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.*;

@Service("userDetailsServiceImpl")
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class UserDetailsServiceImpl implements UserDetailsService {

    private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

    @Autowired
    private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        net.dntuan.training.mvc.domain.User dbUser = this.userDao.getUserByUsername(username);
        logger.debug("dbUser is null? " + (dbUser == null));
        List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
        roles.add(Role.USER);

        User user = new User(dbUser.getUsername(), dbUser.getPassword(), dbUser.getEnable(), true, true, true, roles);
        logger.debug("does not reach here");
        return user;
    }

}

控制台顯示如下

[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Creating new transaction with name [net.dntuan.training.mvc.security.authentication.UserDetailsServiceImpl.loadUserByUsername]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' (AbstractPlatformTransactionManager.java:366)
[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Opened new Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] for Hibernate transaction (HibernateTransactionManager.java:416)
[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Preparing JDBC Connection of Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] (HibernateTransactionManager.java:426)
[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Exposing Hibernate transaction as JDBC transaction [org.postgresql.jdbc4.Jdbc4Connection@2826e5d8] (HibernateTransactionManager.java:487)
Hibernate: select this_.id as id1_1_0_, this_.enable as enable2_1_0_, this_.fullname as fullname3_1_0_, this_.password as password4_1_0_, this_.username as username5_1_0_ from public.user this_ where this_.username=?
[DEBUG] [net.dntuan.training.mvc.security.authentication.UserDetailsServiceImpl] - dbUser is null? true (UserDetailsServiceImpl.java:27)
[TRACE] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Triggering beforeCompletion synchronization (AbstractPlatformTransactionManager.java:936)
[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Initiating transaction rollback (AbstractPlatformTransactionManager.java:844)
[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Rolling back Hibernate transaction on Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] (HibernateTransactionManager.java:570)
[TRACE] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Triggering afterCompletion synchronization (AbstractPlatformTransactionManager.java:965)
[DEBUG] [org.springframework.orm.hibernate4.HibernateTransactionManager] - Closing Hibernate Session [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] after transaction (HibernateTransactionManager.java:632)

在使用Eclipse進行調試之后,我認為Spring默認情況下似乎正在捕獲異常。
我是Spring的新手,所以我的問題是:為什么Spring默認會捕獲它? Spring如何做到這一點?

只是因為您沒有看到它的明確提及,並不意味着沒有拋出NPE。 由於日志消息清楚地表明了這一點,因此很可能引發了數據庫事務回滾。

更新:
Spring的事務管理基礎結構在這里捕獲異常(實際上是任何Throwable ),並且這樣做是為了能夠實現事務配置描述的行為(=方法上@Transactional批注的屬性)。 默認情況下,任何RuntimeException觸發回滾(請參閱@Transactional settings上的文檔 ),因為這些被認為是不可恢復的錯誤情況。 如果在org.springframework.transaction包上啟用跟蹤級別日志記錄,您將能夠看到日志中提到的方法拋出的NullPointerException異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM