我正在使用Apache CXF作为我的JAX-RS实现RESTful API。我有一个POST端点,它应该接收带有三个参数的请求。这是我的代码片段(修改和缩短):
@Path("endpoint_path")
public class MyResource {
@Context
private HttpServletRequest request;
@POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response postEndpoint(@QueryParam("param1") String param1,
@FormParam("param2") String param2,
@FormParam("param3") String param3) {
(use request as input for some library)
}
}
在该方法中,param2
和param3
都具有预期值,但如果我检查请求对象的参数(使用request.getParameterNames()
),我只会得到一个参数 - param1
- 而不是全部三个。我确信我已收到所有3个参数,param1
作为查询参数,param2
和param3
作为表单参数,因为正如我刚才所说,我得到了他们的值作为方法参数传递。它们似乎不存在于请求对象中。
这让我很困惑,我创建了一个Filter
,只做了一件事,它在参数名称的请求中查看,并且不做任何其他事情:
public class TestCXFPostParamsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
servletRequest.getParameterNames();
filterChain.doFilter(servletRequest, servletResponse);
}
(init() and destroy() empty methods)
}
在我的web.xml文件中,我将过滤器设置为应用于我的端点的每个请求。现在,事情变得奇怪了 - 出于某种原因,这使得一切正常,我的意思是,如果我在端点方法中检查请求对象,它将包含所有三个预期参数。这是什么巫术?
作为旁注,有些人可能想知道为什么我会费心去检查请求对象,当我刚才说我可以访问由CXF的servlet传递给方法的参数值时?答案是我使用的库希望您将请求对象传递给它,而不仅仅是必要的值。所以我真的需要保持其参数的请求(就像我一直认为的那样)。
最后,我使用的是Java 6和CXF 2.7.10(Apache Camel CXF 2.13.0附带)。是的,这些或多或少都是为了所有意图和目的,所以如果所有这一切发生的原因是因为其中一个部分中的一个错误,我会被一个无用的过滤器作为& #34;溶液"