2013-11-08 3 views
3

Я запускаю Glassfish 4 и Jersey как исполнение JAX-RS. Я обеспеченный мое EJB так:Использование защищенного EJB с веб-службы JAX-RS

@Stateless 
@DeclareRoles({"Authentication_Reader"}) 
@RolesAllowed({"Authentication_Reader"}) 
public class AuthenticationServiceBean { 
    public void foo() { 
     ... 
    } 

}

Я создал запись безопасности ролей отображения в GlassFish-web.xml, и я также создал декларацию безопасности роли в сети .xml.

Следующие работы из сервлета:

@WebServlet(name = "TestServlet", urlPatterns = {"/test.do"}) 
@RunAs("Authentication_Reader") 
public class TestServlet extends HttpServlet { 

    @Inject 
    private AuthenticationServiceBean authenticationService; 

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     authenticationService.foo(); 
     .. etc ... 
    } 
} 

Но если я делаю это из ресурса JAX-RS, например, этот:

@RequestScoped 
@RunAs("Authentication_Reader") 
@Path("test") 
public class TestResource { 
    @Inject 
    private AuthenticationServiceBean authenticationServiceBean; 

    @GET 
    public String test() { 
     int x = 123; // This code executes fine 
     authenticationServiceBean.foo(); // This gets an AccessLocalException 
     return "I never returned this"; 
    } 
} 

Журнал сервера GlassFish в основном говорит: javax .ejb.AccessLocalException: Клиент не авторизовался для этого вызова

Не понимаю, почему это работает для сервлета, а не для ресурса REST. Для меня это похоже на то, что все должно работать нормально.

+0

РЕЗЮМЕ: Похоже, это невозможно. –

ответ

3

Если вы меняете TestResource на EJB, и если вы введете AuthenticationServiceBean, используя @EJB, он должен работать.

Вы можете посмотреть пример jersey-ejb. Также имеется модуль интеграции jersey-gf-ejb, который будет использоваться для использования EJB на Glassfish AS. Это Джерси специфический, JAX-RS не поддерживает ввод EJB в класс ресурсов еще.

Смежные вопросы