我正在使用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对象。解决这个问题的方法?
答案 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) {
...
}