2013-12-13 3 views
2

Я хотел бы реализовать REST API с помощью Jersey 2, и я хотел бы иметь ресурсы разделены на интерфейсы и их реализацию, как, например:REST API с помощью Jersey 2

@Path("hello") 
public interface HelloLogic { 
    @GET 
    @Produces("application/json") 
    public String hello(); 
} 

public class HelloLogicResource implements HelloLogic { 
    public String hello() { 
     return "{\"reply\": \"Hello\"}"; 
    } 
} 

у меня нет какого-либо везение получения ресурсы разоблачены. Для приветствия ресурса только что упомянул, я надеялся, что следующий будет достаточно:

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     register(new MyApplicationBinder()); 
    } 
} 

public class MyApplicationBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
     bind(HelloLogic.class).to(HelloLogicResource.class); 
    } 
} 

web.xml:

<servlet> 
    <servlet-name>MyApplication</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>stines.api.MyApplication</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyApplication</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

pom.xml:

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet</artifactId> 
    <version>2.4.1</version> 
</dependency> 

Но при ударе

http://localhost:8080/hello 

Получаю ответ 404:

Input будет весьма признателен :) Спасибо.


Новое открытие: работает с этим:

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     registerClasses(HelloLogicResource.class); 
    } 
} 

ответ

1

Это работает:

public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     registerClasses(HelloLogicResource.class); 
    } 
} 
2

Edit 1: Вы должны сказать Джерси, где ваши ресурсы:

public MyApplication() { 
    packages("stines.api.resources"); 
    register(new MyApplicationBinder()); 
} 

Я верю в это если вы хотите использовать пакет, в котором живет HelloLogic, но при необходимости вы можете добавить несколько пакетов:

public MyApplication() { 
    packages("stines.api.resources;stines.api.resources.impl"); 
    register(new MyApplicationBinder()); 
} 

Edit 2: удалено примечание о задом Guice связывания

+0

Спасибо, но, кажется, не имеет никакого значения, к сожалению ... – Stine

+0

Обновлено мой ответ , Я думаю, что вам также не нужен призыв к пакетам. – Alden

+0

Кажется, что работает с более простым MyApplication, который я только что добавил в нижней части моего вопроса. Я получаю предупреждение «Компонент интерфейса класса stines.api.HelloLogic не может быть создан и будет проигнорирован», если я попытаюсь зарегистрировать HelloLogic. – Stine

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