Может ли RestEasy сериализовать POJO для метода @GET? - PullRequest
8 голосов
/ 22 ноября 2011

Мы используем Resteasy и не можем понять, как вызывать некоторые методы @GET.

Если интерфейс для метода имеет только простые параметры, проблем нет. Пример:

@GET
@Path("/test/{myparam}")
public FacetQueryResultImpl testMethod(@PathParam("myparam")String myparam);

Но если мы попытаемся использовать POJO в качестве параметра, похоже, что RestEasy не сможет сериализовать его как параметры строки запроса. Пример:

@GET
@Path("/testGet")
public FacetQueryResultImpl testMethod(ParamPojo myparam);

или

@GET
@Path("/testGet")
public FacetQueryResultImpl testMethod(@QueryParam("myparam")ParamPojo myparam);

(с, ParamPojo.java:)

public class ParamPojo
{
    private String name;
    private String description;
    (...)
}

Когда мы пытаемся это сделать, иногда службы не обнаруживаются, а иногда мы получаем «У запроса GET не может быть тела». исключение.

Используя @POST, мы можем использовать параметр POJO, но некоторые из наших методов ничего не изменяют на сервере, и поэтому должны использовать @ GET.

Обходной путь - «взорвать» ParamPojo и использовать все его свойства в качестве отдельных параметров для метода. Но это убирает «легкую» часть «RestEasy», не так ли?

Ответы [ 2 ]

13 голосов
/ 23 ноября 2011

Вы должны использовать аннотацию @org.jboss.resteasy.annotations.Form в параметре вашего метода.http://docs.jboss.org/resteasy/docs/2.2.1.GA/userguide/html_single/#_Form

Пример:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

import junit.framework.Assert;

import org.jboss.resteasy.annotations.Form;
import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.mock.MockDispatcherFactory;
import org.jboss.resteasy.mock.MockHttpRequest;
import org.jboss.resteasy.mock.MockHttpResponse;
import org.junit.Test;

public class TestCase {
    @Path("/")
    public static class Service {

        @Path("")
        @GET
        public String get(@Form ValueObject vo){
            return vo.getParam();
        }
    }

    public static class ValueObject {
        @QueryParam("myparam")
        private String param;

        public String getParam() {
            return param;
        }
    }

    @Test
    public void test() throws Exception {
        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getRegistry().addSingletonResource(new Service());

        MockHttpRequest request = MockHttpRequest.get("/?myparam=somevalue");
        MockHttpResponse response = new MockHttpResponse();

        dispatcher.invoke(request, response);

        Assert.assertEquals("somevalue", response.getContentAsString());
    }
}
2 голосов
/ 26 сентября 2013

Для связывания нескольких queryParam в один объект нам нужно добавить @Form <POJO CLASS> в качестве аргументов в методе ответа. У нас работает нормально.

@GET    
@Path("/")  
@Produces("application/json")
@Consumes("application/json")
public Response search(@Form CatalogSearchRequest reqObject) {
    System.out.println("Entered into service" + reqObject.getAttribute());
}

Класс POJO должен содержать @QueryParam("") для каждого атрибута, например:

@QueryParam("pageSize")
public Integer pageSize;

@QueryParam("page")
public Integer page;

public Integer getPageSize() {
    return pageSize;
}

public void setPageSize(Integer pageSize) {
    this.pageSize = pageSize;
}

public Integer getPage() {
    return page;
}

public void setPage(Integer page) {
    this.page = page;
}
...