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/