Джерси не находит ресурсы: ошибка 404

Я работаю над простым RESTful API, используя Jersey 2.10 и работая на Tomcat 8.

это мой класс Application:

package com.manager.api.application;

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath ("api")
public class Application extends ResourceConfig {

    public Application () {
        packages ("com.manager.api.resources");
    }
}

Мой пакет Ресурсы содержит:

интерфейс: Resources.java

package com.manager.api.resources;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

public interface Resources {

    @GET
    @Produces (MediaType.APPLICATION_JSON)
    public JsonObject getList ();

    @GET
    @Path ("value=/{id}")
    @Produces (MediaType.APPLICATION_JSON)
    public JsonObject get (String id);

    @POST
    @Path ("value=/{data}")
    @Consumes (MediaType.APPLICATION_JSON)
    public void post (JsonObject data);

    @PUT
    @Path ("value=/{data}")
    @Consumes (MediaType.APPLICATION_JSON)
    public void put (JsonObject data);

    @DELETE
    @Path ("value=/{id}")
    public void delete (String id);
}

Абстрактный класс: ResourcesImpl.java, который реализует интерфейс Resources.

package com.manager.api.resources;

public abstract class ResourcesImpl implements Resources {
}

И, наконец, класс ресурсов, который расширяет ResourcesImpl.java: UserResources.java

package com.manager.api.resources;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import com.manager.api.dao.UserDao;

@Path ("value=/users")
public class UserResources extends ResourcesImpl {

    private UserDao user = new UserDao ();

    @GET
    @Path ("value=/test")
    @Produces (MediaType.TEXT_PLAIN)
    public String Test () {
        return "Test";
    }

    @Override
    public JsonObject getList () {
        return user.getList ();
    }

    @Override
    public JsonObject get (String id) {
        return user.get (id);
    }

    @Override
    public void post (JsonObject data) {
        user.post (data);
    }

    @Override
    public void put (JsonObject data) {
        user.put (data);
    }

    @Override
    public void delete(String id) {
        user.delete (id);
    }
}

и мой web.xml содержит только тег <display-name>:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
        id="WebApp_ID" version="3.1">

    <display-name>manager-api</display-name>
</web-app>

Я успешно запускаю свой проект, но получаю 2 проблемы:

Обнаружены следующие предупреждения: ПРЕДУПРЕЖДЕНИЕ. Метод HTTP GET, общедоступный JsonObject com.manager.api.resources.UserResources.get(java.lang.String), не должен использовать никакой объект. : что мне кажется странным, так как я поставил @Produces (MediaType.APPLICATION_JSON) и не поставил @Consumes для этого метода.

Наконец, большой проблемой является ошибка 404, которую я получаю, когда набираю: http://localhost:8080/manager-api/api/users/test, когда он должен печатать Test в виде текста.

Есть ли у вас какие-либо идеи о том, что является причиной этих 2 ошибок? Спасибо.


person Community    schedule 30.06.2014    source источник
comment
у вас есть тег <servlet-mapping> или <filter-mapping> в вашем файле web.xml?   -  person Xinzz    schedule 30.06.2014
comment
@Xinzz: Спасибо за ваш ответ. Нет, не знаю. в официальном документе сказано: для простых развертываний вообще не нужен файл web.xml. Вместо этого можно использовать аннотацию @ApplicationPath для аннотации пользовательского подкласса Application и определения URI базового приложения для всех ресурсов JAX-RS, настроенных в приложении. jersey.java.net/documentation/latest/deployment.html   -  person    schedule 30.06.2014
comment
Я знаю, что это устарело, но ваши пути должны быть в формате @Path(/test) или @Path(value=/test), а не @Path(value=/test).   -  person Bal    schedule 02.02.2016


Ответы (1)


arrow_upward
1
arrow_downward

Убедитесь, что ваш pom.xml имеет сервлет 3.0, а не 2.0. Также попробуйте указать абсолютный путь вместо относительного в аннотации @ApplicationPath (например, «/api»). Также, возможно, ваше объявление пакета неверно для конфигурации ресурсов?

Обратитесь к этому, если у вас есть дополнительные проблемы: Как настроить приложение JAX-RS, используя только аннотации (без web.xml)?

person Xinzz    schedule 30.06.2014
comment
Спасибо за ваш ответ. На самом деле я не использовал Maven. Это обязательно? - person ; 30.06.2014
comment
Это не обязательно, но я очень рекомендую. Ознакомьтесь с jersey.java.net/documentation/latest/getting-started.html для учебника. Я бы сгенерировал архетип maven образца проекта Джерси и пошел бы оттуда :) - person Xinzz; 30.06.2014