RestEasy可以为@GET方法序列化POJO吗?

ele*_*ype 8 java jax-rs resteasy

我们使用Resteasy并且在如何调用某些@GET方法时遇到问题.

如果方法的接口只有简单的参数,则没有问题.例如:

@GET
@Path("/test/{myparam}")
public FacetQueryResultImpl testMethod(@PathParam("myparam")String myparam);
Run Code Online (Sandbox Code Playgroud)

但是如果我们尝试使用POJO作为参数,似乎RestEasy无法将其序列化为查询字符串参数.例如:

@GET
@Path("/testGet")
public FacetQueryResultImpl testMethod(ParamPojo myparam);
Run Code Online (Sandbox Code Playgroud)

要么

@GET
@Path("/testGet")
public FacetQueryResultImpl testMethod(@QueryParam("myparam")ParamPojo myparam);
Run Code Online (Sandbox Code Playgroud)

(用,ParamPojo.java :)

public class ParamPojo
{
    private String name;
    private String description;
    (...)
}
Run Code Online (Sandbox Code Playgroud)

当我们尝试这个时,有时候找不到服务,有时候我们会得到"A GET请求不能有一个身体".例外.

使用@POST我们可以使用POJO具有参数,但是我们的一些方法不会修改服务器上的任何内容,因此应该使用@GET.

解决方法是"爆炸"ParamPojo,并将其所有属性用作方法的分离参数.但这消除了"RestEasy"中的"Easy"部分,不是吗?

eid*_*den 13

您必须@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());
    }
}
Run Code Online (Sandbox Code Playgroud)