, читая новые спецификации сервлета 3.0, я нашел метод startAsynch для HttpServletRequest, который утверждает, что делает вещи асинхронными способами распространения правильной контекстной информации на пройденную runnable.Servlet 3.0 AsyncContext и EJB @RolesAllowed в JBoss
Я написал этот код в методе doGet моего сервлета:
@EJB
private EJBManagerLocal manager;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
if(request.getUserPrincipal() != null && request.isUserInRole("admin"))
//Method protected by @RolesAllowes("admin") annotation EJB-side
manager.verify();
final AsyncContext ctx = request.startAsync(request,response);
ctx.start(new Runnable(){
HttpServletRequest = (HttpServletRequest)ctx.getRequest();
if(request.getUserPrincipal() != null && request.isUserInRole("admin"))
//Method protected by @RolesAllowes("admin") annotation EJB-side
manager.verify();
});
}
При вызове manager.verify() в первый раз, за пределами AsyncContext все работает отлично, но при входе внутри Runnable в отладке, я могу см., что даже «if» успешно передается (так что принцип был правильно распространен на Runnable в AsyncContext), при вызове метода EJB, защищенного аннотацией @RolesAllowed, JBoss генерирует исключение, говорящее, что «вызов метода проверяет " не допускается.
Может ли кто-нибудь мне помочь?
Платформа: JBoss EAP 6.2.0
EDIT: То же самое поведение в JBoss EAP 6.3.0
Привет, Федерико, спасибо за ваш ответ, да, это правда, что контекст правильно распространяется на runnable ... но я спрашиваю, почему контекст сервлета получил от Async, у которого есть главный, а контекст EJB этого не делает. .. Я ожидал также принципиального распространения между контекстами с этим подходом. К сожалению, я не могу использовать Asynchronous EJB, потому что я использую потоки для улучшения производительности пользовательского интерфейса, а не для загрузки данных. – Antlia
@Antlia Я обновил ответ с дополнительной информацией. Я думаю, что jboss не реализует распространение в runnable, когда это выполняется из AsyncContext.start (Runnable). –
Большое спасибо за те документы, которые вы опубликовали, я искал по всему Интернету и нашел что-нибудь. За ссылку, которую вы опубликовали на форуме JBoss, она была опубликована в моей учетной записи: D – Antlia