Java bean共享接口时的EJB注入

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

我正在为jboss应用程序更新一些遗留代码,我遇到了一些麻烦。我有两个ejb bean,PersonBean和ClientBean。ClientBean负责处理特定于客户端的服务。ClientBean被注入PersonBean的一个实例,它使用该实例作为委托将请求传递给服务器端服务。我遇到的问题是,这两个bean还实现了一个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);
    }    
}
@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中删除,看起来效果不错。如果你把它贴出来作为答案,我会把它标记为正确的。谢谢