当前位置: 首页 > 知识库问答 >
问题:

带有注入Multivalue edMap的注入提供程序(应用程序/x-www-form-urlencoded)

宋经赋
2023-03-14

Jersey文档给出了如何在资源上注入HttpSession的示例。我应该如何注入(或以其他方式访问)在请求中发送的表单参数,并使用“Content Type:application/x-www-form-urlencoded”?我看到这些都是作为参数在方法上传递的,而且似乎没有注释,让我相信这里有一些怪癖?

我目前使用的(naive)工厂实现如下,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) {
    }
}

我在这里认为应该将实体提供者注入实例,以便我可以检查是否确实有随请求一起发送的实体。尝试直接注入Multivalue edMap错误:

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)

共有1个答案

颜镜
2023-03-14

当你这么做的时候

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

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

不过,您可以做的是注入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();
}
 类似资料:
  • 问题内容: 我做错了什么? 根据文件,我应该能够注入到......但我得到一个错误- “未知供应商” http://jsfiddle.net/g26n3/ 实际上,我在这里有三个问题… 1)如何注入模块的配置。 2)如何向模块配置注入相同的提供程序()。 3)如果我将相同的提供程序注入到两个模块的配置中,它将是相同的提供程序实例,还是两个不同的实例? 谢谢! 问题答案: 您需要添加“ Provid

  • 我正在尝试使用,但数据没有到达PHP。我认为这是因为当使用标题始终设置为

  • 这是一个奇怪的用例,我需要一些帮助来弄清楚如何相互结合使用辅助/提供者/FactoryModuleBuilders。忽略的缺失。这只是一个例子。 属于我无法更改的库的一组特征具有以下模式。它使用蛋糕图案。 由于这些特征不能被直接注入,我创建了一个允许它们被注入的包装器 在我的代码中,我有一个依赖于服务的控制器,而服务又依赖于库。根据控制器的需要,服务应能够使用“BB”或“CC”。组件如下所示 我将

  • 如果我创建一个提供者并将其绑定到一个类,就像这样 然后

  • 这是模块类 这是我的viewmodel构造函数 当我运行应用程序时,我得到这个错误,我认为不要在模块中注入所需的应用程序上下文,任何帮助都会被赞赏 C:\XYZ\XYZ\AndroidStudioProjects\CarAndroid\app\build\generate\source\kapt\debug\com\sw\car\baseclasses\CarApp_HiltComponents.

  • RESTAPI在映射到Java对象时采用输入内容类型:application/x-www-form-urlencoded,如 在表单输入请求中,我正在设置my_name和my_phone的值,但MyRequest对象的myName和myPhone为null。 我正在使用Jackson annotations 2.3 jar 有什么建议吗?可能有什么问题?