2015-05-16 2 views
1

Я пытаюсь получить JSR-311 plugin, работая с Grails 2.3.7. Я использую версию 0.10, потому что я думаю, что 0.11 требует Grails 2.4.Ошибка локализации вспомогательных ресурсов Джерси

Я использовал команду generate-resource, чтобы создать конечную точку для моего класса домена Product. Созданы два класса ресурсов: ProductCollectionResource и ProductResource. Я переделаны их немного, но по сути они выглядят так:

ProductCollectionResource

@Path('/api/products') 
@Consumes(['application/json']) 
@Produces(['application/json']) 
class ProductCollectionResource { 

    def productResourceService 

    @Path('{id}') 
    @GET 
    ProductResource getResource(@PathParam('id') Long id) { 
     new ProductResource(productResourceService: productResourceService, id:id) 
    } 

    @GET 
    Response readAll(@QueryParam("max") Integer max, @QueryParam("offset") Integer offset) { 
     ok productResourceService.readAll(max, offset) 
    } 
} 

ProductResource

@Consumes(['application/json']) 
@Produces(['application/json']) 
class ProductResource { 

    def productResourceService 
    def id 

    @GET 
    Response read() { 
     ok productResourceService.read(id) 
    } 
} 

readAll Метод в ProductCollectionResource работает нормально - когда я ударил он, я возвращаю список продуктов, однако, когда я пытаюсь получить доступ к определенному продукту по id (на /api/products/123), Я получаю следующее сообщение об ошибке:

Caused by MessageException: A message body writer for Java class com.myapp.ProductResource, and Java type class com.myapp.ProductResource, and MIME media type application/json was not found 
->> 285 | write    in com.sun.jersey.spi.container.ContainerResponse 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 1479 | _handleRequest  in com.sun.jersey.server.impl.application.WebApplicationImpl 
| 1391 | handleRequest . . in  '' 
| 1381 | handleRequest  in  '' 
| 416 | service . . . . . in com.sun.jersey.spi.container.servlet.WebComponent 
| 538 | service   in com.sun.jersey.spi.container.servlet.ServletContainer 
| 716 | service . . . . . in  '' 
| 193 | process   in org.grails.jaxrs.web.JaxrsContext$JaxrsServiceImpl 
|  45 | handle . . . . . . in org.grails.jaxrs.JaxrsController 
| 195 | doFilter   in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
|  63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter 
| 150 | invoke    in net.bull.javamelody.JspWrapper 
| 285 | invoke . . . . . . in net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler 
| 198 | doFilter   in net.bull.javamelody.MonitoringFilter 
| 176 | doFilter . . . . . in  '' 
|  67 | doFilter . . . . . in  '' 
|  53 | doFilter   in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter 
|  82 | doFilter   in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter 
|  63 | doFilter . . . . . in com.odobo.grails.plugin.springsecurity.rest.RestLogoutFilter 
|  46 | doFilterInternal in org.grails.jaxrs.web.JaxrsFilter 
|  82 | doFilter . . . . . in com.brandseye.cors.CorsFilter 
| 1145 | runWorker   in java.util.concurrent.ThreadPoolExecutor 
| 615 | run . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 744 | run    in java.lang.Thread 

Так это выглядит, как он пытается Маршалл моего ProductResource класса в формат JSON, который я думаю, это не совсем то, что я хочу. Я думаю, что он должен вызывать метод ProductResource.read() и сортировать возвращаемое значение из этого метода в JSON.

ответ

2

У меня нет никакого опыта в Grails бы то ни было, но от чистого Джерси точки зрения взглянуть на то, что вы получили здесь

@Path('{id}') 
@GET 
ProductResource getResource(@PathParam('id') Long id) { 

Это метод ресурсов (конечная точка). Таким образом, ProductsResource будет рассматриваться как тело ответа, как и любой другой метод ресурсов.

Вы, кажется, пытаетесь использовать функциональность локатора подресурсов, пересылая класс ProductsResource. Для этого для локатора подресурсов (getResource) не должно быть аннотации @HttpMethod. Это один из факторов, который отличает метод ресурсов от локатора подресурсов.

Так что просто удалите @GET из метода getResource. @GET уже установлен методом read() в ProductsResource, что и будет называться.

  • Для получения дополнительной информации обратитесь к документации по Sub-Resource Locators
+0

Brilliant, который работал. Благодаря! – rcgeorge23

Смежные вопросы