Difference between ways to get events (EventListenerProvider vs ProviderEventListener)?

Trying to determine the best/most correct way to have keycloak send user org/membership events.

From the docs it seems that the way to go is to implement EventListenerProviderFactory and EventListenerProvider .
But then I’m required to fish out the details I want (userId, orgId, group) from a combination of path and details (parse JSON). Which I found error prone and made me wonder if it’s the intended way.

Then I found that I can implement ProviderEventListener and check for strongly typed events (such as OrganizationModel.OrganizationMemberLeaveEvent). Which I found to be less error prone.

What’s the difference between ProviderEventListener and EventListenerProvider?

public class EventLogger implements EventListenerProvider, ProviderEventListener {
    //( omitted for brevity ...)
    @Override
    public void onEvent(ProviderEvent event) {
        if (event instanceof OrganizationModel.OrganizationMemberLeaveEvent leaveEvent) {
            log.infof("user id: %s", leaveEvent.getUser().getId());
            log.infof("org id: %s", leaveEvent.getOrganization().getId());
        }
    }

    @Override
    public void onEvent(AdminEvent event, boolean includeRepresentation) {
        if(
                event.getResourceType() == ResourceType.ORGANIZATION_MEMBERSHIP &&
                event.getOperationType() == OperationType.DELETE)
        {
            log.info(event.getRepresentation());
            log.info(event.getDetails());
            log.info(event.getResourcePath());
        }
    }

}

Both will work, but frankly ProviderEventListener is better if there is a ProviderEvent available for the type of change you’re looking for.