Внедрение EJB, когда компоненты совместно используют интерфейс

#java #dependency-injection #wildfly #ejb-3.2

#java #внедрение зависимостей #wildfly #ejb-3.2

Вопрос:

Я работаю над обновлением некоторого устаревшего кода для приложения jboss, и я столкнулся с небольшой проблемой. У меня есть два компонента ejb, PersonBean и ClientBean. ClientBean отвечает за обработку специфичных для клиента сервисов. ClientBean получает экземпляр PersonBean, который он использует в качестве делегата для передачи запросов службам на стороне сервера. Проблема, с которой я сталкиваюсь, заключается в том, что оба компонента также реализуют интерфейс LoginService, который также необходимо ввести. Я хочу, чтобы экземпляр PersonBean был введен в ClientBean в качестве LoginService, но в итоге я получаю, что ClientBean вводится сам в себя.

Что мне нужно сделать, чтобы правильно определить это отображение ejb?

ClientServiceProviderBean:

 @Stateless(name = "ClientServiceProvider")
@Local({ ClientServiceProvider.class, LoginService.class })
public class ClientServiceProviderBean implements ClientServiceProvider, LoginService
{
    @EJB(name = "personService")
    protected PersonService personService;  

    @EJB(name = "loginService")
    protected LoginService loginService;

    @Override
    public LoginDTO getLoggedInUser()
    {
        LoginDTO loginDTO = loginService.getLoggedInUser();
        return loginDTO;
    }

    @Override
    public Long activateSession(String applicationName, String ipAddress)
    {
        return personService.activateSession(applicationName, ipAddress);
    }    
}
 

PersonServiceBean личный сервис:

 @Stateless(name = "PersonService")
@Local({ PersonService.class })
@Remote({ RemotePersonService.class })
public class PersonServiceBean implements PersonService, RemotePersonService, LoginService
{
    @Override
    @RolesAllowed({ "authenticated" })
    public Long activateSession(String applicationName, String ipAddress)
    {
        Person p = getCallerAsPerson(entityManager, context.getCallerPrincipal());
        SessionActivity sessionActivity = new SessionActivity(p.getId(), applicationName, true, ipAddress);
        sessionActivity = save(entityManager, sessionActivity);
        return sessionActivity.getId();
    }

    @Override
    @PermitAll
    public LoginDTO getLoggedInUser()
    {
        Principal p = context.getCallerPrincipal();
        if (p != null amp;amp; !"unauthenticated".equals(p.getName()))
        {
            try
            {
                Person person = getCallerAsPerson(entityManager, p);
                if (person != null)
                {
                    return createLoginDTO(person);
                }
            }
            catch (javax.persistence.NoResultException e)
            {
            }
        }
        return null;
    }
}
 

Комментарии:

1. Вы должны добавить LoginService.class в @Local аннотацию PersonServiceBean и удалить из ClientServiceProviderBean

2. @ areus Похоже, это сработало. Если вы опубликуете ответ в качестве ответа, я пометлю его как правильный. Спасибо!

Ответ №1:

Если вы хотите внедрить PersonServiceBean как LoginService in ClientServiceProviderBean , вы должны добавить LoginService.class в @Local аннотацию PersonServiceBean и удалить ее из ClientServiceProviderBean .