Разница в развертывании веб-приложения и веб-службы Java на Azure Tomcat

У меня возникли проблемы с развертыванием в контейнере сервлетов Azure Tomcat. Я подключаюсь к созданному пространству веб-приложения с помощью FTP, копируя файл war в нужную папку.

мое веб-приложение

Я успешно развернул простое веб-приложение Spring MVC в Azure. Шаблон URL приведен ниже, и оба работают так, как ожидалось:

  • http://myWebApp.azurewebsites.net/myWebApp Развернуто на Azure Tomcat
  • http://localhost:8080/myWebApp Развернуто на локальном Tomcat

Ключевой файл web.xml ниже:

<web-app ... xsd schemas ... >

    <display-name>myWebApp</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>... not important ...</context-param> 
    <listener>... not important ...</listener>
</web-app>

моя веб-служба

Что ж, проблема возникает, когда я хочу таким же образом развернуть простой веб-сервис и посмотреть его содержимое.

Я решил использовать библиотеку jersey. Вот единственный пример класса:

@Path("Sample")  
public class Sample {
    @GET  
    @Path("/")  
    @Produces(MediaType.TEXT_XML)  
    public String Method() {
        return "<tag>" + 123 + "</tag>";  
    }
}

После clean install и запуска на локальном сервере Tomcat по URL-адресу http://localhost:8080/myWebService/Sample он правильно дает мне XML <tag>123</tag>".

Надеюсь, я развернул его в Azure так же, как и предыдущий myWebApp, и попытался запустить его по URL-адресу http://myWebService.azurewebsites.net/myWebService. Вместо этого он выдал мне ошибку 404, говоря, что запрошенный ресурс недоступен.

Вот web.xml наверняка:

<web-app ... xsd schemas ... >
    <display-name>myWebService</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>nch.webservices</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Что я упускаю и делаю неправильно? Я заметил разницу между обоими файлами web.xml в url-pattern, которая:

  • myWebApp использует /
  • myWebService использует /*

Когда я использую <url-pattern>/</url-pattern> в myWebService, он либо не работает на локальном хосте. Спасибо за помощь. Не стесняйтесь спрашивать дополнительную информацию, если это необходимо (хотел сделать вопрос как можно короче).


person Nikolas Charalambidis    schedule 25.01.2017    source источник
comment
Это проблема с путем. 1. Пожалуйста, покажите мне строку ‹Context docBase=myWebApp path=/ reloadable=true source=org.eclipse.jst.jee.server:myWebApp /›‹/Host›, которую можно найти в вашем Azure tomcat/conf/server.xml.2. Дайте мне знать корневой контекст вашего проекта, который можно найти в вашей среде IDE. Щелкните правой кнопкой мыши свой проект --- Свойства --- Настройки веб-проекта. 3. Сколько папок в вашей Azure Каталог tomcat/webapps? Являются ли они ROOT и myWebApp?   -  person Romeo    schedule 26.01.2017


Ответы (1)


Согласно вашему описанию и кодам, я попытался успешно воспроизвести вашу проблему с myWebService. Проблема 404 доступа к http://myWebService.azurewebsites.net/myWebService из myWebService была вызвана тем, что url-pattern не соответствует URL-адресу Method класса Sample, см. пояснения ниже.

  1. В классе Sample аннотация класса @Path("Sample") и аннотация метода @Path("/") для метода Method означают, что доступным URL-адресом для метода Method класса Sample в проекте myWebService является http://myWebService.azurewebsites.net/myWebService/Sample/.
  2. Значение url-pattern / означает соответствие только URL-адресу http://myWebService.azurewebsites.net/myWebService/.

В вашем случае есть два решения.

  1. Рекомендуемые. Используйте подстановочный знак /* вместо / для url-pattern и получите доступ к URL-адресу http://myWebService.azurewebsites.net/myWebService/Sample/. И предложение изменить аннотацию класса @Path("Sample") на @Path("/Sample") для чтения и понимания.

  2. Измените аннотацию класса @Path("Sample") только на @Path("") или @Path("/"), если не измените url-pattern, но любые аннотации пути для других классов не будут совпадать.

person Peter Pan    schedule 26.01.2017
comment
Вы сделали мой день! Я ценю вашу попытку воспроизвести это для меня и спасибо за ваши подсказки. Оба решения работают как шарм! Большое спасибо ;)) - person Nikolas Charalambidis; 26.01.2017