@Post Jersey В методе с аннотацией javax.ws.rs.POST допускается только один аннотированный параметр - PullRequest
0 голосов
/ 08 октября 2018

Я использую Джерси с предложением сделать веб-сервис.

Я пытаюсь сделать это метод @Post, который получает 3 параметра по форме и 1 по URL.

@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();
}

Но когда я делаю это, я получаю предупреждение от затмения: в методе с аннотацией javax.ws.rs.POST допускается только один аннотированный параметр.А также при выполнении я получаю следующую ошибку:

сообщение java.lang.IllegalStateException: @FormParam используется, когда тип содержимого объекта запроса не является application / x-www-form-urlencoded

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, а также не хочу создавать бесконечные объекты POJO для каждого @Post, который у меня есть,Как правильно решить эту проблему?

1 Ответ

0 голосов
/ 08 октября 2018

@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) {
    ...
}
...