Проект WebService Java на Gradle Project
Я занимаюсь разработкой WebService на Java с использованием NetBeans и использую gradle в качестве управления зависимостями.
Я нашел эту статью о разработке веб-проектов с Gradle. Он использует плагин 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. Джерси является одной из таких реализаций. Чтобы использовать реализацию Джерси, вам действительно нужна только следующая зависимость
compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.23'
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.23'
Последняя зависимость заключается в добавлении поддержки JSON/POJO. Еще одна вещь, которую вам не хватает в вашем коде, это @ApplicationPath
аннотации на вашем Application
учебный класс
@ApplicationPath("/")
public class ApllicationConfig extends Application {
@ApplicationPath
аннотация устанавливает отображение сервлета для приложения Джерси. Если вы изменили его на /api
то URI, к которому вы будете обращаться,
http://localhost:8080/sisvendas/api/produtos