当用户查询填充的 /rest/data?page=1&limit=20 时,我必须将 Spring Pageable 对象注入(inject)到 @GET 带注释的处理程序中根据本指南设置参数
http://docs.spring.io/spring-data/rest/docs/2.0.0.M1/reference/html/paging-chapter.html
@GET
@Path("/rest/data")
@Produces({MediaType.APPLICATION_JSON + "; charset=UTF8"})
public List<SanomalokiDTO> getData(Pageable pageable) {
return service.getData(pageable);
}
但是,我收到以下错误
SEVERE: No message body reader has been found for class org.springframework.data
.domain.Pageable, ContentType: application/octet-stream
elo 19, 2016 12:06:24 IP. org.apache.cxf.jaxrs.impl.WebApplicationExceptionMappe
r toResponse
WARNING: javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.
java:1315)
...
我尝试向处理程序添加 @Consumes({MediaType.APPLICATION_OCTET_STREAM})
注释,但仍然收到相同的错误。看起来 jax-rs 正在尝试从空消息正文而不是 url 参数构建对象。如何将可分页对象绑定(bind)到这些参数并注入(inject)它,而不必注入(inject) @RequestParam 并手动构建它?
最佳答案
您必须使用 BeanParam 注释分页参数注解。然后在 Pageable 中,您必须使用 QueryParam 注释您的字段。
所以像这样:
@GET
@Path("/rest/data")
@Produces({MediaType.APPLICATION_JSON + "; charset=UTF8"})
public List<SanomalokiDTO> getData(@BeanParam Pageable pageable) {
return service.getData(pageable);
}
以及您的 Pageable 类:
public class Pageable {
@QueryParam("page")
private Integer page;
@QueryParam("limit")
private Integer limit;
...
}
如果您无法控制 Pageable 类,您可以按如下方式解决:
public class PageableBuilder {
@QueryParam("page")
private Integer page;
@QueryParam("limit")
private Integer limit;
...
public Pageable build() {
//create Pageable object
}
}
在资源中:
@GET
@Path("/rest/data")
@Produces({MediaType.APPLICATION_JSON + "; charset=UTF8"})
public List<SanomalokiDTO> getData(@BeanParam PageableBuilder pageableBuilder) {
return service.getData(pageableBuilder.create());
}
关于java - 如何将 url 参数绑定(bind)到 jax-rs 中的 Controller 参数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39035431/