Resteasy @FormParam returns 始终为空

Resteasy @FormParam returns always null

谁能帮我解决这个问题。

我使用 resteasy 和 wildfly 8.1.0 创建了一个网络服务,但是 @FormParam 总是 returns null。

UserService.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来测试服务。

return 将是 {null:null:null:null:null:null:null:null:null:null}

谢谢。我很感激。

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

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

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

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

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

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

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

我也会遇到同样的问题因为

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

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