Редактировать Моя первоначальная проблема заключалась в том, что я не использовал правильную версию трикотажа. Итак, я внес изменения и сохранил предыдущий вопрос для дальнейшего использования. Однако, если вы используете 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)
Что я делаю неправильно?
Вы пробовали @Produces ({"text/html"})? Также вы можете попробовать изменить «index» на «/ index» – user
Он дает ту же ошибку, просто заменяя тип mime в ошибке – Ankit
Является ли зависимость опечатка в вашем файле gradle? Он показывает jsp –