当前位置: 首页 > 知识库问答 >
问题:

只有一个未注释的参数是允许在一个方法javax.ws.rs.POST注释

左劲
2023-03-14

我正在使用泽西提议做一个网络服务。

我想做的是一个@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个答案

缪兴腾
2023-03-14

@FormParam应该用于有效负载是表单的请求(并且该方法用@消费注释,其值例如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) {
    ...
}
 类似资料:
  • 是否允许在一个方法中使用多个@scheduled注释?

  • 问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导

  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A

  • 鉴于此注释: my library的用户可以扩展其API,创建带有注释的自定义注释,如下所示: AbstractProcessor提供了一个名为getSupportedAnnotationTypes的方法,该方法返回处理器支持的注释类型的名称。但是如果我指定的名称,如下所示: 当使用注释对类进行注释时,不会通知处理器#进程方法。 因此,当使用

  • 我正在使用:Spring 4、Hibernate 4、SQL Server 2008 } 但是,当我添加数据并尝试在列codecnbv和/或zipcode中输入第二个带有NULL的记录时,我会收到一个异常,说明我违反了unique约束。 我的要求是我必须允许多个空值,并且当值不是空值时,我应该有唯一的值,即。 56000--确定 空--确定 34089--确定 空--确定 34089--不允许 3