Регистрация ресурсов и пакетов в Джерси - PullRequest
0 голосов
/ 13 декабря 2018

Я решил заменить Web .XML в этой части:

   <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-
     class>org.glassfish.jersey.servlet.ServletContainer</servlet-     
     class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.skillsimprover.restexamples.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>

      <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/api/*</url-pattern>
      </servlet-mapping>

Я указываю на контейнер сервлета Джерси , который будет принимать запросы к REST -Контроллеры, указывающие, что при загрузке необходимо сканировать пакет REST по пути com.skillsimprover.restexamples.rest и указывать, что базовый URI дляВсе методы и классы ресурса заполнены / api / *

Начиная с версии JAX-RS 2.x , вы можете использовать Application или ResourceConfig классы для регистрации пакетов и ресурсов.

Я выполнил код следующим образом:

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

    public JerseyConfig() {
        packages("com.skillsimprover.restexamples.rest");
        register(EmployeApi.class);
    }
    }

Таким образом, необходимо указать,какой пакет и в нем под пакетами нужно сканировать.Используя аннотацию @ ApplicationPath ("api") , я подумал заменить

 <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/api/*</url-pattern>
 </servlet-mapping>

Но ничего не работает.

В чем может быть ошибка?И почему мне нужно указывать классы ресурсов, поскольку я указал пакет для сканирования?

Почему этот метод не заменяет Web.XML и как заменить Web.xml?

А если классов ресурсов может быть много, их нужно будет в больших количествах зарегистрировать?То есть лучше использовать Web.XML?

Или его можно обойти?

<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>


        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <version>${jersey.rest.version}</version>
        </dependency>


        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.rest.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.26</version>     
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlets.version}</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

1 Ответ

0 голосов
/ 14 декабря 2018

Итак, как сказал Пол Самсота (выше в комментарии), нужно поменять артефакт
jersey-container-servlet-core на artefact jersey-container-servlet .

Теперь это pom.xml.

<dependencies>
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>${mysql.version}</version>
   </dependency>


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


   <dependency>
       <groupId>org.glassfish.jersey.media</groupId>
       <artifactId>jersey-media-json-jackson</artifactId>
       <version>${jersey.rest.version}</version>
   </dependency>

   <dependency>
      <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>2.26</version>       
   </dependency>

       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>${servlets.version}</version>
           <scope>provided</scope>
       </dependency>

</dependencies>

web.xml

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

    <resource-ref>
        <description>This section describes link to the DataSource JNDI resource</description>
        <res-ref-name>jdbc/personnel_department_db_link</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
</web-app>

И файл конфигурации, который регистрирует классы и пакет

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

    public JerseyConfig() {

        packages("com.skillsimprover.restexamples.rest");
        register(AuthenticationResource.class);
        register(AccessDeniedExceptionMapper.class);
        register(AuthenticationExceptionMapper.class);
        register(DataNotFoundExceptionMapper.class);
    }
}

У меня вопрос.

Я видел примеры, когда классы ресурсов зарегистрированы, и если пакет JerseyСonfig не зарегистрирован, этого недостаточно для Джерси.найти класс ресурса.Необходимо ли регистрировать классы ExceptionMapper в JerseyСonfig , если они находятся в пакете, который уже зарегистрирован для сканирования?

...