Добавьте класс контроллера в сервлет, используя аннотацию Jersey, получая 404 - PullRequest
0 голосов
/ 05 февраля 2020

В сети. xml определяется это отображение сервлета:

<servlet>
    <servlet-name>JAX-RS External REST Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>xxx.rest.external.XxxExternalRestApplication</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.feature.DisableWADL</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>JAX-RS External REST Servlet</servlet-name>
    <url-pattern>/external/rest/*</url-pattern>
</servlet-mapping>

Я не могу изменить сеть. xml.

Я создал WebAppplicationInitializer в порядке получить зарегистрированный сервлет по пути /external/rest Вот код:

package com.xxx.extended.base.config.sailpoint;

import com.xxx.extended.controllers.IRestControllerMarker;
import com.xxx.extended.controllers.LocalManagedEntitlementsRestController;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.servlet.ServletProperties;
import org.springframework.web.WebApplicationInitializer;

import javax.servlet.ServletContext;

/**
 * Uses to extend parameter of external rest api to include custom controllers
 */
public class XxxExternalRestWebApplicationInitializer implements WebApplicationInitializer
{
    private static final Logger log = LogManager.getLogger(XxxExternalRestWebApplicationInitializer.class);
    /**
     * Rest api servlet name
     */
    private static final String REST_SERVLET_NAME = "JAX-RS External REST Servlet";


    @Override
    public void onStartup(ServletContext servletContext) {
        log.debug("Try to get external servlet by name:[{}]", REST_SERVLET_NAME);



        var registration = servletContext.getServletRegistration(REST_SERVLET_NAME);

        if (registration == null) {
            log.error("Could not find external servlet registration. External api will not work!!!!");
            return;
        }

        registration.setInitParameter(ServerProperties.PROVIDER_PACKAGES, LocalManagedEntitlementsRestController.class.getPackageName());

        log.debug("Registered the controllers from this package: [{}]",IRestControllerMarker.class.getPackage().getName());

    }
}

После запуска приложения WebApplicationInitializer фактически распознается, но когда я отправляю GET-запрос на контроллер Я получаю 404 Not Found, я уверен, что URL-адрес в порядке.

На самом деле кажется, что он не сканирует пакет для извлечения контроллеров. У меня такое ощущение, что поскольку в приложении определено: xxx.rest.external.XxxExternalRestApplication класс контроллеров регистрируется однозначно, он не собирается сканировать пакеты.

Вот упрощенный код контроллера, который я пытаюсь использовать:

@Path("custom")
public class LocalManagedEntitlementsRestController extends BaseResource
{
    private static final Logger log = LogManager.getLogger(LocalManagedEntitlementsRestController.class);

    @GET
    @Path("/")
    public String sayHello()
    {
        return "Welcome to the world of REST";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...