编辑我最初的问题是我没有使用正确版本的球衣。所以,我做了更改并保留了上一个问题以供将来参考。但是,如果您使用的是Jersey 2.x
,请转到此问题中的更新标题。
我正在尝试使用在Jetty上运行的Jersey和Mustache编写一个简单的Web应用程序。为了构建项目,我正在使用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媒体类型 找不到application / xml
由于我是Java EE Web开发和Jersey和Jersey-MVC的新手,我无法弄清楚我做错了什么以及如何解决它。
更新修复球衣版本后
我使用旧版泽西岛。所以,现在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);
}
}
现在,我有一个应该使用Mustache服务的类/资源。它是:
@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
时,Web应用程序部署在localhost:8080 / Backend )
我做错了什么?
答案 0 :(得分: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
你正在使用Jersey 2.x org.glassfish
。
但这并没有解决使用Mustache的问题。目前我可以通过查看the different extension modules来判断,我看不到任何对Mustache的支持,只有Freemarker。我不知道,但如果你想使用Mustache支持,你可能需要切换到Jersey 2.x,除非在那里有一个1.x实现,我不知道。