2016-06-02 4 views
1

Я разрабатываю WebService в Java с использованием NetBeans и использую gradle as man management.WebService Project Java on Gradle Project

Я нашел this article о разработке веб-проектов с градиентом. Он использует плагин Gretty. Я выполнил инструкции (просто изменил контейнер сервлетов с причала на tomcat) и мог разработать/развернуть веб-проект и открыть «домашнюю страницу» из сервлета.

Проблема заключается в том, что мои классы WebService работают некорректно. Все запросы GET, полученные из моего браузера, возвращают код ошибки 404. Для тестирования я создал новый WebProject, используя Netbeans, но на этот раз без Gradle, и он работает как шарм.

Здесь следует код:

build.gradle

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'org.akhikhl.gretty:gretty:+' 
    } 
} 

apply plugin: 'java' 
apply plugin: 'war' 
apply plugin: 'org.akhikhl.gretty' 

gretty { 
    port = 8088 
    contextPath = '/sisvendas' 
    servletContainer = 'tomcat8' 
} 
repositories { 
    mavenCentral() 
} 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.10' 
    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' 
    compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1' 

} 

Ресурс:

@Path("produtos") 
public class ProdutosResource { 

    @Context 
    private UriInfo context; 

    public ProdutosResource() { 
    } 

    @GET 
    @Produces("application/json") 
    public String getJson() { 
     // Just for testing... 
     return "{\"produtos\":\"arroz\"}"; 
    } 

    @PUT 
    @Consumes("application/json") 
    public void putJson(String content) { 
    } 
} 

класс конфигурации Применение:

public class ApllicationConfig extends Application{ 

@Override 
public Set<Class<?>> getClasses() { 

    Set<Class<?>> resourcesSet = new java.util.HashSet<>(); 
    adicionarClassesRecursos(resourcesSet); 
    return resourcesSet; 

} 

private void adicionarClassesRecursos(Set<Class<?>> resources) { 
    resources.add(com.gear.dev.webprojectgradle.resources.ProdutosResource.class); 
} 

} 

И это URL для GET: http://localhost:8088/sisvendas/produtos

Как я уже говорил ранее, следующий запрос работает: http://localhost:8088/sisvendas/ (Существует также index.html файл, который бесполезен)

Что я делаю неправильно?

ответ

1

JAX-RS - это только спецификация. Он должен быть реализован, чтобы использовать его. У вас есть javax.ws.rs-api, это только спецификация jar. Реализации не существует, то есть нет возможности запуска приложения. Реализация обеспечивает механизм запуска приложения JAX-RS.

Эта спецификация JAX-RS является частью спецификации Java EE, поэтому, если вы работаете на полностью совместимом сервере приложений Java EE, например Wildfly или Glassfish, тогда на этом сервере приложений будет JAX- RS уже внутренне, поэтому все, что вам нужно на уровне проекта приложения, - это спецификация jar для компиляции исходного кода, а сервер приложений будет иметь механизм запуска приложения во время выполнения.

Но в вашем случае Tomcat не является сервером, совместимым с Java EE. Это только контейнер сервлетов, который реализует спецификацию сервлета. Так что вам все равно нужна реализация JAX-RS , если вы хотите использовать JAX-RS с Tomcat. Jersey - одна такая реализация. Для того, чтобы использовать реализацию Джерси, вам действительно нужно только следующую зависимость

compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.23' 
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.23' 

Последняя зависимость является добавление поддержки/POJO JSON. Еще одна вещь, вам не хватает в вашем коде является @ApplicationPath аннотацию на вашем Application класса

@ApplicationPath("/") 
public class ApllicationConfig extends Application { 

@ApplicationPath аннотацию задает отображение сервлета для приложения Джерси.Если вы изменили его на /api, тогда вам будет доступен URI

http://localhost:8080/sisvendas/api/produtos 
+0

Спасибо @peeskillet, это сработало! Я думал, что если бы я хотел, чтобы пустой ApplicationPath мог удалить эту аннотацию. Вот почему я удалил аннотацию. –

+0

Существуют различные способы настройки развертывания приложения. В случае использования _no_ web.xml, единственный способ обнаружения приложения - через аннотацию '@ ApplicationPath'. Если вы удалите его, он не будет запущен, так как приложение не будет обнаружено, если вы не настроите развертывание в файле web.xml –