2016-03-11 1 views
-2

Я пытаюсь создать службу на основе REST, используя Jersey 2.x/Java с двумя разными методами GET. Они должны иметь одинаковые конечные точки, а одна операция - поиск списка продуктов, и для этого требуется список параметров запроса. Другая операция заключается в загрузке брошюры продукта в виде файла pdf, и это требует только параметра пути. MY Мой класс ресурсов выглядит следующим образом:Возможны несколько операций GET в REST, дифференцированных с помощью queryparam и pathparam?

@Path("/domain") 

public class MyResource { 


    @GET 
    @Path("/home/products") 
    @Consumes({ MediaType.APPLICATION_JSON }) 
    @Produces({MediaType.APPLICATION_JSON }) 

    public SearchResult loansHomeLoansDocumentsGet(
     @QueryParam("productType") String productType, 
     @QueryParam("productSubType") String productSubType, 
     @QueryParam("productSource" 
     @QueryParam("toDate") String toDate) throws Exception { 

     ....... 
    } 


    @GET 
    @Path("/home/products/{productId}") 
    @Consumes({ MediaType.APPLICATION_JSON }) 
    @Produces({MediaType.APPLICATION_JSON}) 

    public SuccessResponse loansHomeLoansDocumentsDocumentReferenceIdGet(@PathParam("productId") String productId) { 
      ....... 
    } 


...... 
} 

Но когда я убежал, он выбрал 406 недопустимое исключение.

javax.ws.rs.NotAcceptableException: HTTP 406 Not Acceptable 
at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.getMethodRouter(MethodSelectingRouter.java:529) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.access$000(MethodSelectingRouter.java:94) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter$4.apply(MethodSelectingRouter.java:779) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.apply(MethodSelectingRouter.java:371) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:109) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:92) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:61) ~[jersey-server-2.22.1.jar:?] 
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197) ~[jersey-common-2.22.1.jar:?] 
at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:318) [jersey-server-2.22.1.jar:?] 

Действительно ли это так, чтобы поддерживать два метода GET? Любые комментарии или ввод приветствуются.

Спасибо.

+1

Вы установили заголовок 'Accept: application/json' в запрос клиента? Нет ничего плохого в ваших определениях метина –

+0

Извинения за поздний ответ. У меня есть это в заголовке. Есть предположения ? – bkrish

+0

Ваш код выглядит хорошо, и он имеет 2 GET. Может ли проблема заключаться в том, что вы используете для JSON? Чтобы убедиться, что это проблема, попробуйте вернуть строку вместо SearchResult/SuccessResponse. – Amber

ответ

0

// Добавлен метод @BeanParam EntityRequest в обоих методах get. Это работает для меня!

@GET 
@JSONP(queryParam = JSONP.DEFAULT_QUERY) 
@ApiOperation(value = "Get a list of Products", notes = "Search for products.", position = 1, response = ProductEntityCollectionResponse.class) 
@ApiResponses(value = {@ApiResponse(code = HttpURLConnection.HTTP_OK, message = HTTPStatusMessageConstants.SUCCESS_MESSAGE), 
     @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = HTTPStatusMessageConstants.INTERNAL_SERVER_ERROR_MESSAGE)}) 
public ProductEntityCollectionResponse getMany(@BeanParam EntityCollectionRequest request, @BeanParam ProductSearch search) { 

    List<Product> pojos = myService.findProducts(request, search); 
    ProductEntityCollectionResponse response = new ProductEntityCollectionResponse(request, pojos); 
    return response; 
} 

@GET 
@Path("/{id}") 
@JSONP(queryParam = JSONP.DEFAULT_QUERY) 
@ApiOperation(value = "Get a single product", notes = "Search for a specific product with the provided ID.", response = Product.class) 
@ApiResponses({@ApiResponse(code = HttpURLConnection.HTTP_OK, message = HTTPStatusMessageConstants.SUCCESS_MESSAGE), 
     @ApiResponse(code = HttpURLConnection.HTTP_INTERNAL_ERROR, message = HTTPStatusMessageConstants.INTERNAL_SERVER_ERROR_MESSAGE)}) 
public Product getOne(
     @BeanParam EntityRequest entityRequest, 
     @ApiParam(value = "The ID of the product to retrieve", name = "id", required = true, allowMultiple = false) @PathParam("id") String id) { 
    return myService.findProduct(id); 
} 
Смежные вопросы