#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
.