处理POST请求参数时的奇怪行为

时间:2016-03-02 21:59:43

标签: java web-services rest cxf httprequest

我正在使用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)
    }
}

在该方法中,param2param3都具有预期值,但如果我检查请求对象的参数(使用request.getParameterNames()),我只会得到一个参数 - param1 - 而不是全部三个。我确信我已收到所有3个参数,param1作为查询参数,param2param3作为表单参数,因为正如我刚才所说,我得到了他们的值作为方法参数传递。它们似乎不存在于请求对象中。

这让我很困惑,我创建了一个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;溶液"

0 个答案:

没有答案