2016-08-06 3 views
2

У меня есть несколько RESTful услуг с использованием Джерси, работающим на Grizzly. Все маршруты с @PathParam возвращает 404 код ошибки. Кто-нибудь может посоветовать, где искать?Все джерси маршруты с @PathParam возвращает 404

Рабочая:

@GET 
@Path("/testget") 
@Produces(MediaType.APPLICATION_JSON) 
Response testGet(){ 
    //working 
} 

не работает:

@GET 
@Path("/testpath/{id}") 
@Produces(MediaType.APPLICATION_JSON) 
Response testPath(@PathParam("id") String id){ 
    //not working, return 404 
} 

Если удалить путь из параметров, он начинает работать. Но мне нужен параметр пути.

Grizzly код:

 ResourceConfig resourceConfig = new ResourceConfig(); 
     resourceConfig.register(TestController.class); 

     HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URL), resourceConfig, false); 
     server.start(); 
+0

Вы говорите, что url '.../testget' работает, но URL-адрес, например' .../testpath/abc', не работает? – Andreas

+0

точно, thats проблема. Я думаю, джерси/гризли не могут отобразить testpath/abc для testpath/{id} – Shafiul

+0

Невозможно воспроизвести. Я только что создал новый проект, используя инструкции из [здесь] (http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/griz_jersey_intro/Grizzly-Jersey-Intro.html), а затем добавил оба метода к образец класса 'MyResource', заставляя их возвращать« Hello from ». Оба работали нормально. – Andreas

ответ

1

После большого исследования, я нашел свое решение. Я добавляю его здесь, поскольку кто-то может быть полезен от этого.

Проблема

Я обнаружил, что, добавив POST и путь по методу интерфейса вызывает проблему. И это происходит, когда есть параметр @PathParam в методе.

проблематичен: Интерфейс:

@POST 
@Path("/test/{id}") 
public String testPost(@PathParam("id") String id); 

класса (базовый ресурс, на пути аннотацию уровня класса):

@Override 
public String testPost(@PathParam("id") String id){ 
    return "hello" + id; 
} 

Решение

Класс:

@POST 
@Path("/test/{id}") 
@Override 
public String testPost(@PathParam("id") String id){ 
    return "hello" + id; 
} 

Не имеет значения, добавляю ли я интерфейс POST и Path по интерфейсу или нет. Но они должны быть добавлены к методу реализации. По крайней мере, это работает для меня, я не знаю, почему аннотация в интерфейсе не работает. Как спецификации J2EE говорит:

Blockquote Для согласованности с другими спецификациями Java EE, рекомендуется всегда повторять аннотации вместо того, чтобы полагаться на наследование аннотаций.

Итак, добавляю аннотацию в классы.

+0

Вы должны удалить @PathParam из реализации, иначе все аннотации по интерфейсу будут проигнорированы. Этот ответ http://stackoverflow.com/a/37623021/105668 объясняет это более подробно. –