سؤال

أقوم بتشغيل Glassfish 4 و Jersey كتطبيق Jax-RS. لقد قمت بتأمين EJB مثل هذا:

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

}

لقد أنشأت إدخالًا في رسم خرائط للأمان في Glassfish-web.xml ، وقد قمت أيضًا بإنشاء إعلان للأمان في web.xml.

الأعمال التالية من 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 ، وليس لمورد REST. بالنسبة لي ، يبدو أن هذا يجب أن يعمل بشكل جيد.

هل كانت مفيدة؟

المحلول

إذا تغيرت TestResource لتكون EJB وإذا حقن AuthenticationServiceBean استخدام @EJB يجب أن تعمل.

يمكنك النظر في جيرسي-ejb مثال. وهناك أيضا Jersey-GF-EJB وحدة التكامل لاستخدامها لاستخدام EJBs على الأسماك الزجاجية. هذا هو جيرسي محدد ، Jax-RS لا يدعم حقن EJB في فئة الموارد حتى الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top