如果您更改 TestResource
成为EJB,如果您注入 AuthenticationServiceBean
使用 @EJB
它应该起作用。
你可以看 泽西-ejb 例子。还有 泽西-GF-EJB 集成模块用于在玻璃鱼上使用EJB。这是 球衣 具体,JAX-RS不支持将EJB注入资源类。
题
我正在运行Glassfish 4和Jersey作为JAX-RS实施。我已经确保了这样的EJB:
@Stateless
@DeclareRoles({"Authentication_Reader"})
@RolesAllowed({"Authentication_Reader"})
public class AuthenticationServiceBean {
public void foo() {
...
}
}
我已经在Glassfish-web.xml中创建了一个安全性映射条目,并且我还在web.xml中创建了一个Security-lole声明。
以下来自servlet的作品:
@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:未授权此调用的客户端
我不明白为什么这适用于servlet,而不适合其余资源。对我来说,这似乎应该很好。