Java bean共享接口时的EJB注入
我正在为jboss应用程序更新一些遗留代码,我遇到了一些麻烦。我有两个ejb bean,PersonBean和ClientBean。ClientBean负责处理特定于客户端的服务。ClientBean被注入PersonBean的一个实例,它使用该实例作为委托将请求传递给服务器端服务。我遇到的问题是,这两个bean还实现了一个LoginService接口,该接口也需要注入。我想要的是PersonBean的一个实例被注入ClientBean作为loginService,但我最终将ClientBean注入它自己 我需要做什么来正确定义这个ejb映射 ClientServiceProviderBean:Java bean共享接口时的EJB注入,java,dependency-injection,wildfly,ejb-3.2,Java,Dependency Injection,Wildfly,Ejb 3.2,我正在为jboss应用程序更新一些遗留代码,我遇到了一些麻烦。我有两个ejb bean,PersonBean和ClientBean。ClientBean负责处理特定于客户端的服务。ClientBean被注入PersonBean的一个实例,它使用该实例作为委托将请求传递给服务器端服务。我遇到的问题是,这两个bean还实现了一个LoginService接口,该接口也需要注入。我想要的是PersonBean的一个实例被注入ClientBean作为loginService,但我最终将ClientBean
@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);
}
}
@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 && !"unauthenticated".equals(p.getName()))
{
try
{
Person person = getCallerAsPerson(entityManager, p);
if (person != null)
{
return createLoginDTO(person);
}
}
catch (javax.persistence.NoResultException e)
{
}
}
return null;
}
}
PersonServiceBean:
@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);
}
}
@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 && !"unauthenticated".equals(p.getName()))
{
try
{
Person person = getCallerAsPerson(entityManager, p);
if (person != null)
{
return createLoginDTO(person);
}
}
catch (javax.persistence.NoResultException e)
{
}
}
return null;
}
}
如果您想将
PersonServiceBean
作为ClientServiceProviderBean
中的LoginService
注入PersonServiceBean
中,您应该在PersonServiceBean
的本地选项中添加LoginService.class
,并将其从ClientServiceProviderBean
中删除,您应该添加PersonServiceBean
的@Local
操作中的LoginService.class
,并从ClientServiceProviderBean
@areus中删除,看起来效果不错。如果你把它贴出来作为答案,我会把它标记为正确的。谢谢