今日は NPE の日。国民の休日。

NPEの日とは

国民の祝日に関する法律祝日法、昭和23年7月20日法律第178号)の一部改正によって制定された祝日で、日付は昭和天皇の誕生日である4月29日があてられている。「ゴールデンウィーク」を構成する祝日のひとつでもある。

2連続で立て続けだったので

Glassfishのデプロイにて

一つ目は冷静に NPE です

java.lang.NullPointerException
    at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:538)
    at com.sun.enterprise.deployment.util.DefaultDOLVisitor.accept(DefaultDOLVisitor.java:78)
    at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:123)
    at com.sun.enterprise.deployment.util.ApplicationValidator.accept(ApplicationValidator.java:147)
    at org.glassfish.web.deployment.util.WebBundleValidator.accept(WebBundleValidator.java:81)
    at com.sun.enterprise.deployment.BundleDescriptor.visit(BundleDescriptor.java:621)

Glassfishリポジトリhttps://svn.java.net/svn/glassfish~svn/tags/から当該のソース探ると、

    // if we are here, we must have resolved the reference
    if(DOLUtils.getDefaultLogger().isLoggable(Level.FINE)) {
        DOLUtils.getDefaultLogger().fine("Done Visiting " + getEjbDescriptor().getName() + " reference " + ejbRef);
    }

getEjbDescriptor() がNullです。。これは Glassfish4.0 のソース。

Glassfish4.0.1のソースだと以下のように直ってました。

    // if we are here, we must have resolved the reference
    if(DOLUtils.getDefaultLogger().isLoggable(Level.FINE)) {
        if (getEjbDescriptor() != null){
            DOLUtils.getDefaultLogger().fine("Done Visiting " + getEjbDescriptor().getName() + " reference " + ejbRef);
        }
    }

しょうもない所で時間とられた。

と思った矢先

NPE

java.lang.NullPointerException
    at org.apache.catalina.authenticator.AuthenticatorBase.register(AuthenticatorBase.java:861)
    at org.apache.catalina.authenticator.AuthenticatorBase.logout(AuthenticatorBase.java:973)

今度はなんですか

protected void register(HttpRequest request, HttpResponse response,
        Principal principal, String authType,
        String username, char[] password) {
        
    if (log.isLoggable(Level.FINE)) {
        String msg = "Authenticated '" + principal.getName() + "' with type '"
                     + authType + "'";
        log.log(Level.FINE, msg);
    }

principal.getName() で。また Level.FINE

@Override
public void logout(HttpRequest request) throws ServletException {
    Session session = getSession(request);
    if (session != null) {
        session.setPrincipal(null);
        session.setAuthType(null);
    }

    // principal and authType set to null in the following
    register(request, (HttpResponse)request.getResponse(), null,
            null, null, null);
    }

register の呼び出しで必ずです。 バグレポート挙げときました。