2015-06-04 2 views
1

Я только начинаю с JavaEE (я неплохо владею JavaSE), и у меня возникают проблемы с переносом моего мозга вокруг всех новых вещей, которые необходимы для создания даже самых простых приложений. Сейчас я пытаюсь использовать аннотации JAX-RS для создания простой страницы приветствия Hello World в IntelliJ с использованием Glassfish 4. Я искал для правильного использования этих аннотаций, и кажется, что я делаю это правильно , но я продолжаю получать 404 независимо от того, где я перемещаюсь в локальном хосте. Я начинаю думать, что мне не хватает жизненно важных компонентов в моем коде, и я не знаю достаточно о JavaEE, чтобы узнать, что мне не хватает (возможно, это может быть что-то в XML-файле в Интернете, что я не знаю слишком много о). Вот код, который я написал, минус импорт:Простой JavaEE HTML GET/POST-приложение

@LocalBean 
@Stateless 
@Path("/hello") 
@Produces("text/html") 
public class Hello { 

    @GET 
    @Path("/world") 
    public String printHelloWorld() { 
     return "<html lang=\"en\"><body><h1>Hello, World!</h1></body></html>"; 
    } 
} 

Сам сервер запущен и работает, и приложение, кажется, правильно развернуть. URL-адрес по умолчанию, который настроен во время запуска, - «http://localhost:8080/HelloWorld_war_exploded/», , так что я понимаю, что я должен пойти в http://localhost:8080/HelloWorld_war_exploded/hello/world , чтобы отобразить сообщение.

Если кто-нибудь может указать мне в правильном направлении, это было бы здорово. Благодаря!

EDIT: Вот мой 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"> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
</web-app> 

После глядя на комментарии Lutz, я уже исследовал вопрос базового URL и в настоящее время просматривает ссылку (можно 't ссылку более чем в два раза с моими очками): hxxp: //www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/twbs_jaxrs_configwebxml.html? cp = SSAW57_8 .5.5% 2F1-3-0-28-2-0-1

Я обновлю соответствующим образом. Спасибо за помощь!

+0

Вы зарегистрировали базовый URL-адрес ресурсов JAX-RS? Полученный URL-адрес может выглядеть так: http: // localhost: 8080/HelloWorld_war_exploded/resources/hello/world –

+0

_ «возможно, это может быть что-то в веб-xml» _ - Вы можете показать это нам –

+1

У вас есть используя JAX-RS, для веб-сервисов, чтобы создать веб-страницу? Это не совсем то, для чего предназначены веб-сервисы. – Gimby

ответ

2

Вам необходимо настроить Джерси (реализация JAX-RS в Glassfish) в вашем web.xml. Вы в настоящее время только настройки JSF

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>the.package.where.your.resources.are</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 

<url-mapping> является основой для вашего Джерси приложения. Таким образом, вы будете использовать

http://localhost:8080/HelloWorld_war_exploded/api/hello/world 

Если вы хотите использовать Стандартную конфигурацию JAX-RS, вы можете сделать

<servlet> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
</servlet> 

<servlet-mapping> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 

Это будет сканировать весь путь к классам для ресурсов, так что вам не нужно указывать пакет, как и предыдущая конфигурация.

Или вы можете использовать Java-код

@javax.ws.rs.ApplicationPath("/api") 
public class RestApplication extends javax.ws.rs.core.Application { 

} 

Покидая этот класс пуст будет также сканировать весь путь к классам для ваших ресурсов. Или вы можете добавить свои классы явно

@javax.ws.rs.ApplicationPath("/api") 
public class RestApplication extends javax.ws.rs.core.Application { 
    @Override 
    public Set<Class<?>> getClasess() { 
     Set<Class<?>> classes = new HashSet<>(); 
     classes.add(Hello.class); 
     return classes; 
    } 
} 
+0

Я был на самом деле в середине написания этого точного ответа, но так как вы нашли время для этого, я отброшу его. Да, ответ более или менее состоит в том, чтобы использовать отдельный класс с аннотацией @ @ ApplicationPath. Спасибо за тщательный ответ! – Niko