java - 注入(inject) MultivaluedMap 的注入(inject)提供程序 (application/x-www-form-urlencoded)

标签 java jersey jersey-2.0 hk2

Jersey 文档给出了 how to inject HttpSession on resources 的示例。我应该如何注入(inject)(或以其他方式访问)通过“Content-Type: application/x-www-form-urlencoded”请求发送的表单参数?我看到这些被传递为 parameters on methods, and do not seem to be annotated ,让我相信这里有一些怪癖?

我当前正在使用的(天真的)工厂实现如下,JerseyHttpServletRequestWrapper 是我自己的类之一:

import org.glassfish.hk2.api.Factory;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.MultivaluedMap;

public class JerseyHttpServletRequestWrapperFactory implements Factory<JerseyHttpServletRequestWrapper> {
    private final HttpServletRequest request;
    private final MultivaluedMap<String, String> formParams;

    @Inject
    public JerseyHttpServletRequestWrapperFactory(HttpServletRequest request, MultivaluedMap<String, String> formParams) {
        this.request = request;
        this.formParams = formParams;
    }

    @Override
    public JerseyHttpServletRequestWrapper provide() {
        return new JerseyHttpServletRequestWrapper(request, formParams);
    }

    @Override
    public void dispose(JerseyHttpServletRequestWrapper jerseyHttpServletRequestWrapper) {
    }
}

我在这里认为应该将实体提供程序注入(inject)到实例中,以便我可以检查是否确实存在随请求发送的实体。尝试直接注入(inject) MultivaluedMap 错误:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=MultivaluedMap<String,String>,parent=JerseyHttpServletRequestWrapperFactory,qualifiers={},position=1,optional=false,self=false,unqualified=null,2067821943)

最佳答案

当你这样做时

@POST
public Response post(MultivaluedMap<String, String> params) {}

此方法参数注入(inject)的处理方式与常规字段/构造函数注入(inject)不同。因此,您不能尝试将 MultivaluedMap 注入(inject)字段。

您可以做的是注入(inject)ContainerRequest,然后读取正文。您需要检查它是否是 POST 请求,并且 Content-Type 是否为 application/x-www-form-urlencoded。如果不这样做,当您尝试读取实体时有可能会遇到异常。

@Inject
ContainerRequest request;

if (request.getMethod().toUpperCase().equals("POST")
     && request.getMediaType().equals(MediaType.APPLICATION_FORM_URLENCODED_TYPE)) {
    request.bufferEntity();
    Form form = request.readEntity(Form.class);
    MultivaluedMap<String, String> params = form.asMap();
}

关于java - 注入(inject) MultivaluedMap 的注入(inject)提供程序 (application/x-www-form-urlencoded),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39966793/

相关文章:

java - 按从低到高的顺序对整数进行排序java

java - javafx 中的图像位置位于 Borderpane 中

java - 使用 Jersey REST 维护事务流

java - 使用 ClientResponse 发布时 Jersey 客户端 MessageBodyProviderNotFoundException

java - org.glassfish.jersey.server.ContainerException : java. io.IOException:流关闭

web-services - 带有 jersey 2.0 且没有 maven 的 Restful Web 服务

java - 将 Maven 导出为包含所有依赖项的 jar 文件

java - 为什么 Intellij IDEA 无法识别 ResourceBundleMessageSource 类的 defaultEncoding 字段?

java - 使用 GET 方法使用名称从 API 检索数据

java - Jersey - 验证不适用于查询参数