Автоматически извлекать URL-компонент из каждого запроса - PullRequest
0 голосов
/ 02 января 2019

Я использую Java EE.Каждый раз, когда пользователь отправляет запрос на сервер, URL-адрес будет содержать идентификатор пользователя.Например, URL-адрес может быть

\ http://myApp.com/path-to-resource/?userId=1

Очень большое количество методов, которые я пишу, будет нуждаться в доступе к параметру userId.Я мог бы изменить свой код так, чтобы у каждого из этих методов был дополнительный параметр, аннотированный @QueryParam (userId) String userId, но он кажется немного избыточным и небрежным.

Я надеялся, что это классназывается что-то вроде UserIdProvider, который будет иметь метод с именем getUserId.Мои классы ресурсов имеют экземпляр этого класса, а затем getUserId обращается к текущему запросу и возвращает его параметр userId.

Возможно ли это?Я подумал, что это может быть связано с аннотацией @RequestScoped, но я не смог понять, как ее реализовать.

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Решение, которое я выбрал, заключается в создании фильтра сервлетов, который извлекает userId и делает его именованным свойством Guice.

public class ServletStuff extends ServletModule {
    protected Filter createUserIdScopingFilter() {
        return new Filter() {
            @Override public void doFilter(
                    ServletRequest request, ServletResponse response, FilterChain chain)
                    throws IOException, ServletException {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String userId = httpRequest.getParameter("userId");
                httpRequest.setAttribute(
                        Key.get(String.class, Names.named("userId")).toString(),
                        userId);
                chain.doFilter(request, response);
            }

            @Override public void init(FilterConfig filterConfig) throws ServletException { }

            @Override public void destroy() { }
        };
    }

    @Override protected void configureServlets() {
        filter("*").through(createUserIdScopingFilter());
    }

    @Provides
    @Named("userId") @RequestScoped
    String provideUserId() {
        throw new IllegalStateException("user id must be manually seeded");
    }
}

Затем в моих ресурсах я могу внедрить провайдера, которыйдает мне userId.

private final Provider<String> userIdProvider;

    @Inject
    public ProfileResource(@Named("userId") Provider<String> userIdProvider) {
        this.userIdProvider = userIdProvider;
    }

, который позволяет мне получить доступ к текущему userId, просто позвонив userIdProvider.get().

Я думаю, что это решение на один шаг более запутанное, чем обычно необходимо, так какЯ использую Guice для внедрения зависимостей, который борется со стандартным инжектором зависимостей для jersey / restful java, но он работает хорошо!

0 голосов
/ 02 января 2019

Вы можете использовать фильтр для извлечения этой информации и представления ее, например, в виде компонента CDI, который будет доступен для инъекции.

В качестве альтернативы, в зависимости от ваших потребностей, просто используйте @QueryParam вполе класса ресурса:

@QueryParam("userId")
private Long userId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...