@Post Jersey在带有javax.ws.rs.POST注释的方法中,仅允许使用一个未注释的参数

时间:2018-10-08 15:53:45

标签: java rest post jersey jax-rs

我正在使用Jersey来进行网络服务。

我想做的是一个@Post方法,该方法按格式接收3个参数,按URL接收1个参数。

@POST
@Path("/{contestType}/pay")
public Response pay(@PathParam("contestType") String contestType,
        @FormParam("contestId") Long contestId, @FormParam("username") String username,
        @FormParam("amount") Long amount)
{
    User user = dao.getByKey(User.class, username);
    if (user == null)
        return Response.status(Status.NOT_FOUND.getStatusCode(), "username not valid").build();

    Contest contest = dao.getByKey(Contest.class, contestId);
    if (contest == null)
        return Response.status(Status.NOT_FOUND.getStatusCode(), "contest not valid").build();

    try
    {
        if (contestType.equals("raffles"))
            user.pay(contest, amount);
        else
            user.pay(contest);
    }
    catch (ContestException | PaymentException e)
    {
        Logger.getGlobal().log(Level.WARNING, e.getLocalizedMessage(), e);
    }
    return Response.ok().build();
}

但是当我这样做时,我从eclipse处得到警告:带有javax.ws.rs.POST批注的方法中仅允许一个未批注的参数。 而且当执行时,我还会收到下一个错误:

消息java.lang.IllegalStateException:当请求实体的内容类型不是application / x-www-form-urlencoded时,将使用@FormParam

javax.servlet.ServletException: java.lang.IllegalStateException: The @FormParam is utilized when the content type of the request entity is not application/x-www-form-urlencoded
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:432)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
causa raíz

我需要从客户端接收一个Json,所以我不能使用application / x-www-form-urlencoded,也不想为我拥有的每个@Post创建无限的POJO对象。解决这个问题的方法?

1 个答案:

答案 0 :(得分:1)

@FormParam应该用于有效载荷是一种形式的请求(并且该方法用@Consumes注释,其值例如为MediaType.APPLICATION_FORM_URLENCODED)。

考虑以下代码:

@POST
@Path("/{contestType}/pay")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response pay(@PathParam("contestType") String contestType,
                    @FormParam("contestId") Long contestId, 
                    @FormParam("username") String username,
                    @FormParam("amount") Long amount) {
    ...
}

它期望以以下格式输入:

POST /api/foo/pay HTTP/1.1
Host: example.org
ContentType: application/x-www-form-urlencoded

contestId=1&username=johndoe&amount=1000

如果您的有效载荷是JSON文档,那么@FormParam不适合您。 JAX-RS运行时不会从有效负载中的JSON文档中提取值并将其绑定到方法参数。在这种情况下,请定义一个类以将JSON文档绑定到:

public class PaymentDetails {

    private Long contestId;
    private String username;
    private Long amount;

    // Getters and setters
}
    
@POST
@Path("/{contestType}/pay")
@Consumes(MediaType.APPLICATION_JSON)
public Response pay(@PathParam("contestType") String contestType,
                    PaymentDetails paymentDetails) {
    ...
}