2015-05-07 4 views
1

Редактировать Моя первоначальная проблема заключалась в том, что я не использовал правильную версию трикотажа. Итак, я внес изменения и сохранил предыдущий вопрос для дальнейшего использования. Однако, если вы используете Jersey 2.x, перейдите к . В этом вопросе заголовок.Как создать приложение RESTful с использованием механизма шаблонов Джерси и Усы?

Я пытаюсь написать простое веб-приложение, использующее Джерси и Усы, работающие на Jetty. Для создания проекта я использую Gradle.

Вот мой файл сборки.

apply plugin: 'jetty' 

repositories { 
    mavenCentral(); 
} 

dependencies { 
    providedCompile 'javax.servlet:servlet-api:2.5' 
    runtime 'javax.servlet:jstl:1.1.2' 

    compile 'com.sun.jersey:jersey-core:1.17.1' 
    compile 'com.sun.jersey:jersey-server:1.17.1'    
    compile 'com.sun.jersey:jersey-servlet:1.17.1' 

    compile 'org.glassfish.jersey.ext:jersey-mvc-mustache:2.3.1' 
} 

httpPort = 8080 
stopPort = 9080 
stopKey = "stopKey" 

и мой web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <display-name>XPoViz</display-name> 

    <servlet> 
     <servlet-name>HelloWorldServlet</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>com.example.webapp</param-value> 
     </init-param> 

     <init-param> 
      <param-name>jersey.config.server.provider.classnames</param-name> 
      <param-value>org.glassfish.jersey.server.mvc.mustache.MustacheMvcFeature</param-value> 
     </init-param> 

     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>HelloWorldServlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

и у меня есть простой класс контроллера

package com.example.webapp; 

@Path("login") 
public class Login { 
    @Context 
    private SecurityContext context; 

    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    public Viewable get(){ 
     return new Viewable("index", "FOO"); 
    } 
} 

В том же пакете (com.example.webapp) Я создал файл усов под названием index.mustache который представляет собой простую HTML-страницу

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Simple mustache test</title> 
    </head> 
    <body> 
    <h1>This is mustacheee</h1> 
    </body> 
</html> 

Когда я делаю gradle jettyRun, он запустил сервер. Однако, когда я пытаюсь получить доступ к пути входа в систему, он вызывает 500 ошибку, и я вижу следующее сообщение об ошибке на моей консоли

сообщение тела писатель для Java класса org.glassfish.jersey.server.mvc.Viewable, и Java тип класса org.glassfish.jersey.server.mvc.Viewable и MIME тип носителя приложения/XML не найден

Как я новичок в веб-разработки Java EE и Джерси и Джерси-MVC, Я не могу понять, что я делаю неправильно, и как это исправить.

Update После фиксации джерси версии

я использовал старую версию Джерси. Итак, теперь обновлено build.gradle

apply plugin: 'jetty' 


jettyRun { 
    reload = "automatic" 
    scanIntervalSeconds = 1 
} 

repositories { 
    mavenCentral(); 
} 

dependencies {  
    compile 'org.glassfish.jersey.core:jersey-server:2.17' 
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.17' 

    compile 'org.glassfish.jersey.ext:jersey-mvc-jsp:2.17' 
    compile 'org.glassfish.jersey.ext:jersey-mvc-mustache:2.17' 
} 

httpPort = 8080 
stopPort = 9080 
stopKey = "stopKey" 

Кроме того, я решил использовать ResourceConfig. Так что мои web.xml изменения

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <display-name>XPoViz</display-name> 

    <servlet> 
     <servlet-name>HelloWorldServlet</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 

     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.example.webapp.MyApplication</param-value> 
     </init-param> 

     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>HelloWorldServlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

Вот MyApplication

@ApplicationPath("/") 
public class MyApplication extends ResourceConfig { 

    public MyApplication() { 
     // Add a package used to scan for components. 
     packages(this.getClass().getPackage().getName()); 
     register(MustacheMvcFeature.class); 
    } 
} 

Теперь у меня есть класс/ресурс, который должен служить при помощи усов. Это:

@Path("/mustache") 
public class MustacheTest { 

    @GET 
    @Template(name = "/index.mustache") 
    public String get(){ 
     return "foo"; 
    } 
} 

Я также добавил файл index.mustache в каталоге WEB-INF. Тем не менее, когда я получить доступ к http://localhost:8080/Backend/mustache, это дает мне 404 (Примечание: при запуске gradle jettyRunWar, веб-приложение развернуто на локальном хосте: 8080/Backend)

Что я делаю неправильно?

+0

Вы пробовали @Produces ({"text/html"})? Также вы можете попробовать изменить «index» на «/ index» – user

+0

Он дает ту же ошибку, просто заменяя тип mime в ошибке – Ankit

+0

Является ли зависимость опечатка в вашем файле gradle? Он показывает jsp –

ответ

1

Проблема эта

compile 'org.glassfish.jersey.ext:jersey-mvc-mustache:2.3.1' 

Это модуль 2.x Джерси. Вы используете Jersey 1.x. Эти две основные версии несовместимы. Регистрация функции ничего не делает.

Теперь Jersey 1.x поставляется с поддержкой MVC без каких-либо модулей расширения. Достаточных зависимостей. Viewable класс, хотя на самом деле

com.sun.jersey.api.view.Viewable 

Вы используете Джерси 2.x org.glassfish один.

Но это не решает проблему использования Усы. В настоящее время я могу сказать, глядя на the different extension modules, я не вижу поддержки Усы, только Freemarker. Я не знаю, но вам, возможно, придется переключиться на Jersey 2.x, если вы хотите использовать поддержку Mustache, если нет реализации 1.x где-то там, о которой я не знаю.

+0

спасибо, оказывается, я следил за очень старым Например, я переключился на jersey 2.x и получил некоторые другие проблемы. Сейчас я обновлю свой вопрос – Ankit

Смежные вопросы