jax-rs map查询参数对象

时间:2012-12-10 13:08:13

标签: java rest jersey jackson jax-rs

我正在使用jersey 1.2与jersey-server,jersey-json和jersey-spring来创建REST服务。

我的一项服务

@Path("test")
public class TestViewRestController {

@GET
@Path("t1")
@Produces(MediaType.APPLICATION_JSON)
public RetPojo getPojo(
        @QueryParam("token") @DefaultValue("null") String token, 
        @QueryParam("pojo") ParamPojo pojo, 
        @QueryParam("param2") @DefaultValue("null") String param2
        ) {
       //do some stuff
}

}

我创建了一个提供商:

@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class MessageBodyReaderJSON implements MessageBodyReader<APojo> {

/**
 * {@inheritDoc}
 */
public boolean isReadable(Class<?> type, Type genericType,
        Annotation[] annotations, MediaType mediaType) {
    return true;
}

/**
 * {@inheritDoc}
 */
public APojo readFrom(Class<APojo> type, Type genericType,
        Annotation[] annotations, MediaType mediaType,
        MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
        throws IOException {

    APojo p = new ObjectMapper().readValue(entityStream, APojo.class);

    return p;
    }
}

但是,当我启动我的Web服务器时,会抛出以下引发:

com.sun.jersey.api.container.ContainerException: 
Method, public my.package.TestViewRestController.getPojo( java.lang.String, my.package.APojo, java.lang.String), 
annotated with GET of resource, class my.package.TestViewRestController, 
is not recognized as valid Java method annotated with @HttpMethod.

当我用String替换APojo参数时,它可以工作。似乎提供者被忽略了。

使用Jersey的最后一个版本我没有得到问题(我也没有声明提供者)但我无法升级,因为应用程序需要在Java 5上运行(并且最后一个运行版仅从Java 6运行) )。

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我认为您不能将结构化POJO用于​​查询参数,只是简单的标量值?结构化值通常作为PUT / POST有效负载(以JSON或XML格式)发送。