Exception wird gefangen, aber trotzdem in Error Log?

internet

Top Contributor
Ich habe eine Methode, die eig. eine Exception fangen soll:

Java:
import jakarta.ws.rs.NotAuthorizedException;
import jakarta.ws.rs.ProcessingException;

/**
     * Hat der User ein Social Login
     */
    public void doCheckSocialLogin(String username) {

        LOGGER.info("START doCheckSocialLogin");

        try {
            hasSocialLogin = keycloakServiceBean.hasSocialLogin(username);
        }

        catch (ApplicationExternalProviderNotFoundException e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Etwas stimmt in der Keycloak Einstellung nicht. Bitte externe Provider prüfen!", ""));
        }
        
        catch (ProcessingException e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Etwas stimmt in der Keycloak Einstellung nicht. Bitte externe Provider prüfen!", ""));
        }

        
        catch (NotAuthorizedException e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Etwas stimmt in der Keycloak Einstellung nicht. Bitte externe Provider prüfen!", ""));
        }

        catch (Exception e) {
            
        }

        LOGGER.info("END doCheckSocialLogin");
    }


Code:
    /**
     * Hat der User ein Social Login (Facebook, Google..)
     *
     * @throws ApplicationExternalProviderNotFoundException
     * @throws EntityObjectHelperNotFoundException
     * @throws JsonProcessingException
     * @throws JsonMappingException
     *
     */
    public boolean hasSocialLogin(String username) throws JsonMappingException, JsonProcessingException,
            EntityObjectHelperNotFoundException, ApplicationExternalProviderNotFoundException {

        LOGGER.debug("START hasSocialLogin");

        KeycloakLogin keycloakLogin = login();

        boolean result = KeycloakAPICall.hasSocialLogin(keycloakLogin.getKeycloak(), keycloakLogin.getRealmName(),
                username);

        LOGGER.debug("END hasSocialLogin");
        return result;
    }


Code:
    /**
     * Prüfen, ob der User ein Social Login hat
     *
     * @param usersResource
     * @param user
     * @return
     */
    public static boolean hasSocialLogin(Keycloak keycloak, String realmName, String emailAddress) {

        LOGGER.info("START hasSocialLogin");

        // Benutzerressource abrufen
        UsersResource usersResource = keycloak.realm(realmName).users();

        // Interne ID von User erhalten
        String userId = usersResource.list().stream().filter(user -> user.getUsername().equals(emailAddress))
                .findFirst().map(UserRepresentation::getId).orElseThrow();

        UserRepresentation user = usersResource.get(userId).toRepresentation();
    
        // Durchsuchen Sie die Authentifizierungsmethoden des Benutzers
        boolean result = hasSocialLogin(user);
        
        return result;
    }


Code:
    /**
     * Prüfen, ob der User ein Social Login hat
     *
     * @param usersResource
     * @param user
     * @return
     */
    private static boolean hasSocialLogin(UserRepresentation user) {

        LOGGER.info("START hasSocialLogin");

        boolean hasIdentityProviderLinks = false;

        List<FederatedIdentityRepresentation> userIdentityProviderResource = user.getFederatedIdentities();

        if (userIdentityProviderResource == null || userIdentityProviderResource.isEmpty())
            return false;

        for (FederatedIdentityRepresentation federatedIdentityRepresentation : userIdentityProviderResource) {

            if (federatedIdentityRepresentation != null) {
                hasIdentityProviderLinks = true;
                break;
            }
        }

        if (hasIdentityProviderLinks) {
            return true;
        } else {
            return false;
        }
    }

Allerdings erhalte ich dennoch diese Error Message:
Code:
Caused by: jakarta.ws.rs.ProcessingException: jakarta.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized
    at org.jboss.resteasy.resteasy-client@6.2.7.Final//org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.filterRequest(ClientInvocation.java:652)

Was mache ich hier falsch?
 
Was mache ich hier falsch?
Du gibst nicht den ganzen Stacktrace. Da wird doch bestimmt ein ganzer Stacktrace angezeigt. Und da kannst Du schauen, welchen Pfad die Exception genommen hat.

Und dann gibt es zwei einfache Möglichkeiten:
a) Die Exception wird irgendwo gefangen, ins Log geschrieben und dann erneut geworfen
b) Die Exception ist gar nicht bei Deinem Code gewesen. Daher wird dein Catch nie durchlaufen.
 
Naja, ich verstehe es nicht - ich bin mir sicher, dass ich die Exception eigentlich fangen müsste...

Hier der ganze Stacktrace:
Java:
20:03:48,145 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034: Jakarta Enterprise Beans Invocation failed on component KeycloakServiceBean for method public boolean com.myapp.externalapi.keycloak.service.KeycloakServiceBean.hasSocialLogin(java.lang.String) throws com.fasterxml.jackson.databind.JsonMappingException,com.fasterxml.jackson.core.JsonProcessingException,com.myapp.entityhelper.service.EntityObjectHelperNotFoundException,com.myapp.admin.general.service.ApplicationExternalProviderNotFoundException: jakarta.ejb.EJBException: jakarta.ws.rs.ProcessingException: jakarta.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized
20:03:48,145 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034: Jakarta Enterprise Beans Invocation failed on component KeycloakServiceBean for method public boolean com.myapp.externalapi.keycloak.service.KeycloakServiceBean.hasSocialLogin(java.lang.String) throws com.fasterxml.jackson.databind.JsonMappingException,com.fasterxml.jackson.core.JsonProcessingException,com.myapp.entityhelper.service.EntityObjectHelperNotFoundException,com.myapp.admin.general.service.ApplicationExternalProviderNotFoundException: jakarta.ejb.EJBException: jakarta.ws.rs.ProcessingException: jakarta.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized
20:03:48,145 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034: Jakarta Enterprise Beans Invocation failed on component KeycloakServiceBean for method public boolean com.myapp.externalapi.keycloak.service.KeycloakServiceBean.hasSocialLogin(java.lang.String) throws com.fasterxml.jackson.databind.JsonMappingException,com.fasterxml.jackson.core.JsonProcessingException,com.myapp.entityhelper.service.EntityObjectHelperNotFoundException,com.myapp.admin.general.service.ApplicationExternalProviderNotFoundException: jakarta.ejb.EJBException: jakarta.ws.rs.ProcessingException: jakarta.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized
    at deployment.myapp.war//com.myapp.externalapi.keycloak.service.KeycloakServiceBean$$$view324.hasSocialLogin(Unknown Source)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.service.KeycloakServiceBean$$$view324.hasSocialLogin(Unknown Source)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.controller.KeycloakEditController.doCheckSocialLogin(KeycloakEditController.java:42)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.controller.KeycloakEditController.doCheckSocialLogin(KeycloakEditController.java:42)
    at deployment.myapp.war//org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:72)
    at deployment.myapp.war//de.dpunkt.myaktion.util.NoCacheFilter.doFilter(NoCacheFilter.java:48)
    at deployment.myapp.war//org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:183)
    at deployment.myapp.war//org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
    at deployment.myapp.war//org.omnifaces.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:123)
    at deployment.myapp.war//org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
    at deployment.myapp.war//net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:236)
    at deployment.myapp.war//net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:212)
    at deployment.myapp.war//org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:226)
    at deployment.myapp.war//org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at deployment.myapp.war//org.pac4j.jee.filter.SecurityFilter.lambda$internalFilter$0(SecurityFilter.java:94)
    at deployment.myapp.war//org.pac4j.core.engine.DefaultSecurityLogic.perform(DefaultSecurityLogic.java:141)
    at deployment.myapp.war//org.pac4j.jee.filter.SecurityFilter.internalFilter(SecurityFilter.java:92)
    at deployment.myapp.war//org.pac4j.jee.config.AbstractConfigFilter.doFilter(AbstractConfigFilter.java:72)
    at deployment.myapp.war//org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at deployment.myapp.war//org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at deployment.myapp.war//org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at deployment.myapp.war//org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at deployment.myapp.war//org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at deployment.myapp.war//org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    at deployment.myapp.war//org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    at deployment.myapp.war//org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at deployment.myapp.war//org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at deployment.myapp.war//org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at deployment.myapp.war//org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)
    at deployment.myapp.war//org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at deployment.myapp.war//com.sun.proxy.$Proxy204.list(Unknown Source)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.service.KeycloakAPICall.hasSocialLogin(KeycloakAPICall.java:174)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.service.KeycloakAPICall.hasSocialLogin(KeycloakAPICall.java:174)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.service.KeycloakServiceBean.hasSocialLogin(KeycloakServiceBean.java:104)
    at deployment.myapp.war//com.myapp.externalapi.keycloak.service.KeycloakServiceBean.hasSocialLogin(KeycloakServiceBean.java:104)
    at deployment.myapp.war//com.sun.proxy.$Proxy199.grantToken(Unknown Source)
    at deployment.myapp.war//org.keycloak.admin.client.token.TokenManager.grantToken(TokenManager.java:99)
    at deployment.myapp.war//org.keycloak.admin.client.token.TokenManager.getAccessToken(TokenManager.java:75)
    at deployment.myapp.war//org.keycloak.admin.client.token.TokenManager.getAccessTokenString(TokenManager.java:70)
    at deployment.myapp.war//org.keycloak.admin.client.resource.BearerAuthFilter.filter(BearerAuthFilter.java:52)
 
Geworfen wird com.fasterxml.jackson.databind.JsonMappingException - die fängst du nicht. Die hat die andere Exception als Cause drin, wenn ich den Stacktrace richtig lese.

Sieht man bei deinem ersten Auszug auch:
Caused by: jakarta.ws.rs.ProcessingException: jakarta.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized
Die kannst du nicht catches, das ist cause einer anderen Exception
 
Kann es sein, dass das eine EJBException ist, die vorher eine ProcessingException war und davor eine NotAuthorizedException.
So lese ich das zumindest.
Dann müsste man nur die EJBException zu den throws dazupacken und

Java:
public boolean hasSocialLogin(String username) throws JsonMappingException, JsonProcessingException,
            EntityObjectHelperNotFoundException, ApplicationExternalProviderNotFoundException, EJBException {

und der catch (Exception e) { in doCheckSocialLogin() sollte das dann catchen.
 
Geworfen wird com.fasterxml.jackson.databind.JsonMappingException - die fängst du nicht. Die hat die andere Exception als Cause drin, wenn ich den Stacktrace richtig lese.

Sieht man bei deinem ersten Auszug auch:

Die kannst du nicht catches, das ist cause einer anderen Exception
die müsste doch spätestens in "Exception e" gefangen werden...

Java:
/**

     * Hat der User ein Social Login
     */

    public void doCheckSocialLogin(String username) {



        try {

            hasSocialLogin = keycloakServiceBean.hasSocialLogin(username);

        }



        catch (Exception e) {

        }

    }
 
Stimmt - dann wäre interessant, ob irgendwelche Log Einträge deiner Log Statesment da sind. Das sind alles CDI-Beans? Welche Annotationen sind dann da dran?
 
Ich lese es wie @shokwave. Wenn man die Exception mal um die Paketnamen säubert und etwas formatiert:
Code:
20:03:48,145 ERROR [org.jboss.as.ejb3.invocation] (default task-1) WFLYEJB0034:
Jakarta Enterprise Beans Invocation failed on component KeycloakServiceBean for method
public boolean KeycloakServiceBean.hasSocialLogin(java.lang.String) throws JsonMappingException, JsonProcessingException, EntityObjectHelperNotFoundException, ApplicationExternalProviderNotFoundException:
jakarta.ejb.EJBException:
  jakarta.ws.rs.ProcessingException:
    jakarta.ws.rs.NotAuthorizedException: HTTP 401 Unauthorized

Die ProcessingException ist eine RuntimeException und wird daher vom EJB-Container verarbeitet, d. h. geloggt, in eine EJBException verpackt und neu geworfen. Da Dein catch-Block leer ist, siehst Du nur das Logging des EJB-Containers, nicht aber, dass die EJBException im Client tatsächlich gefangen wird. Das wäre mal meine Vermutung.
 

Neue Themen


Zurück
Oben