【问题标题】:Resteasy @FormParam returns always nullResteasy @FormParam 总是返回 null
【发布时间】:2015-03-13 12:06:58
【问题描述】:

谁能帮帮我。

我使用 resteasy 和 wildfly 8.1.0 创建了一个 Web 服务,但 @FormParam 总是返回 null。

用户服务.java

Path("/user")
@Produces(MediaType.APPLICATION_JSON)
public class UserService {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/create")
    public String create(@FormParam("first_name") String firstName, @FormParam("last_name") String lastName,
            @FormParam("email") String email, @FormParam("username") String username,
            @FormParam("password") String password, @FormParam("address") String address,
            @FormParam("country") String country, @FormParam("zip") String zip, @FormParam("ssnlast4") String ssnlast4,
            @FormParam("mobile") String mobile, @FormParam("dob_month") String dobMonth,
            @FormParam("dob_year") String dobYear, @FormParam("reg_type") String regType,
            @FormParam("avatar") String avatar) {

        String str = firstName  + ":" + lastName + ":" + email + ":" + username + ":" + password + ":" + address + ":" + country + ":" + zip+ ":" + ssnlast4 + ":" + mobile;
        return str;
    }
}

我使用POSTMAN 来测试服务。

返回将是{null:null:null:null:null:null:null:null:null:null}

谢谢。我很感激。

【问题讨论】:

  • 谢谢。是否可以同时支持表单数据和x-www-form-urlencoded?我试过@Consumes({"multipart/form-data","application/x-www-form-urlencoded"}),但似乎form-datawww-form-urlencoded工作时返回null
  • 没那么简单。对于多部分,您需要获取 resteas 的多部分依赖项。并且注释是不同的。然后,您需要检查实际出现的 Content-Type 以确定如何继续。您也可以有 2 个方法指向同一个 URI,只是使用不同的 @Consumes,这样一种方法将处理每种内容类型。见here for multipart supportthe dependency
  • 还有另一件事。您可以使用 Java 对象代替所有这些字段。在 java 类中,使用 @FormParam 注释字段或设置器。而方法中的刚刚注释参数为@BeanParam。这样你的方法就不会那么混乱了

标签: jakarta-ee jax-rs resteasy wildfly-8


【解决方案1】:

@FormParam 用于 application/x-www-form-urlencoded 内容类型。您在 Postman 中选择的 form-data 按钮将创建多部分数据。这是两种不同的动物。

如果您希望您的示例工作,您应该选择 x-www-form-urlencoded 按钮,然后开始添加键/值对。键将是注入值的@FormParam("key")

我还会用@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 注释您的方法,这样任何内容类型不是application/x-www-form-urlencoded 的请求都会失败。

如果您确实想使用多部分数据,那就另当别论了。如果您确认这是您想要的,我们可以沿着这条路走下去。不过,我认为它在这里没有用。

顺便说一句,您可以单击 Preview 按钮,您将看到每种类型发送方式的主要区别。

【讨论】:

  • 谢谢。我很感激。
【解决方案2】:

在我们的例子中,ContainerRequestFilter.filter(ContainerRequestContext) 正在调用 containerRequestContext.getEntityStream() 似乎刷新缓冲区,这导致 @FormParams 为空。

作为一种解决方案,我们通过 ajax 请求在 header(ContainerRequestContext.getHeaders()) 中发送身份验证令牌,它不处理 EntityStream

【讨论】:

  • 我现在也有同样的问题,很烦人。 RESTEasy 跟踪器 (issues.jboss.org/browse/RESTEASY-567) 中有一个错误,但它已经关闭,没有进一步的工作解决这个问题。你有解决办法吗?
  • 我找到了解决方法。在通过 getEntityStream() 读取流之前,您只需要 @Inject HttpServletRequest 并调用 getParameterMap() 方法一次。你不需要对它做任何事情,只需调用该方法。我肯定会确切地找出为什么会这样。
【解决方案3】:

我也会面临同样的问题,因为

@FormParam("name") 字符串名称

我们应该在两个地方放置相同的标识符,否则会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2021-01-06
    • 2014-03-04
    • 2016-11-02
    • 2014-05-06
    • 2012-06-05
    • 2014-05-30
    • 2014-02-23
    相关资源
    最近更新 更多