如果找不到记录,则spring security的searchForSingleEntryInternal方法抛出异常

时间:2014-10-02 20:55:49

标签: spring spring-mvc spring-security

我正在处理使用Spring Security的searchForSingleEntryInternal方法的应用程序。如果没有找到记录,有没有办法做同样的事情而不抛出异常?我希望能够创建一个处理丢失记录的条件。

我想改变什么

if (results.size() == 0) {
    throw new IncorrectResultSizeDataAccessException(1, 0);
}

从这个方法

/**
* Internal method extracted to avoid code duplication in AD search.
*/
public static DirContextOperations searchForSingleEntryInternal(DirContext ctx, SearchControls searchControls,
    String base, String filter, Object[] params) throws NamingException {
        final DistinguishedName ctxBaseDn = new DistinguishedName(ctx.getNameInNamespace());
        final DistinguishedName searchBaseDn = new DistinguishedName(base);
        final NamingEnumeration<SearchResult> resultsEnum = ctx.search(searchBaseDn, filter, params, searchControls);

        if (logger.isDebugEnabled()) {
            logger.debug("Searching for entry under DN '" + ctxBaseDn + "', base = '" + searchBaseDn + "', filter = '" + filter + "'");
        }

        Set<DirContextOperations> results = new HashSet<DirContextOperations>();
        try {
            while (resultsEnum.hasMore()) {
                SearchResult searchResult = resultsEnum.next();
                // Work out the DN of the matched entry
                DistinguishedName dn = new DistinguishedName(new CompositeName(searchResult.getName()));

                if (base.length() > 0) {
                    dn.prepend(searchBaseDn);
                }

                if (logger.isDebugEnabled()) {
                    logger.debug("Found DN: " + dn);
                }
                results.add(new DirContextAdapter(searchResult.getAttributes(), dn, ctxBaseDn));
            }
        } catch (PartialResultException e) {
            LdapUtils.closeEnumeration(resultsEnum);
            logger.info("Ignoring PartialResultException");
        }

        if (results.size() == 0) {
            throw new IncorrectResultSizeDataAccessException(1, 0);
        }

        if (results.size() > 1) {
            throw new IncorrectResultSizeDataAccessException(1, results.size());
        }

        return results.iterator().next();
    }
}
我对春天有点新鲜,也许我错过了一些明显的东西。任何建议将不胜感激

1 个答案:

答案 0 :(得分:0)

简单修复,只需从Spring Security复制searchForSingleEntryInternal方法并将其放在我自己的项目中。从那里我能够调整异常处理,因此如果没有找到记录,应用程序就不会停止。