我想让我的JAX-RX应用程序从根上下文开始,所以我的URL将是
http://example.com/restfullPath
并不是
http://example.com/rest/restfullPath
我从这里切换了我的应用程序注释
@ApplicationPath("/rest/*")
Run Code Online (Sandbox Code Playgroud)
对此
@ApplicationPath("/*")
Run Code Online (Sandbox Code Playgroud)
但它似乎接管了服务文件,如/index.html
有没有办法在根应用程序上下文中运行JAX-RS但仍然提供静态页面?
看来这是之前在JBOSS论坛上提出的,但解决方案并不实用
我创建了一个在本地实现REST服务的应用程序:
Eclipse Indigo Jersey 2.4 Tomcat 7.0.47
使用Eclipse在本地运行时,服务工作正常,但在部署我的WAR文件时,尝试对其中一个服务URL执行GET时会出现以下异常:
HTTP Status 500 - Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
type Exception report
message Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
java.lang.Thread.run(Thread.java:662)
root cause
java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:270)
org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:218)
org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:448)
org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:300)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在没有web.xml的情况下将基本的泽西式restful服务部署到Tomcat7:
@WebServlet(loadOnStartup=1)
@ApplicationPath("resources")
@Path("/mypath/{name}")
public class MyResource extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(MyResource.class);
return s;
}
@GET
@Consumes("text/plain")
@Produces("text/plain")
public String getWelcome(@PathParam(value = "name") String name) {
return "Welcome to jax-rs " + name;
}
}
Run Code Online (Sandbox Code Playgroud)
尝试访问时,我遇到了404:/ myapplication/resources/mypath/sample.
我可以使用@WebServlet注释部署servlet ,因此这与将没有web.xml的servlet加载到Tomcat7中无关.
通过阅读Jersey的文档,运行时应扫描扩展Application和执行的类getClasses(),加载所有根资源.
我正在尝试使用web.xml,servlet 3.0和jersey API部署我的应用程序.不幸的是,它不起作用.
这是MyApplication.class:
package com.example;
public class MyApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(MyResource.class);
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
这是MyResource:
@Path("/helloworld")
@Produces(MediaType.TEXT_PLAIN)
public class MyResource {
@GET
public String getHello() {
return "HelloWorld !";
}
}
Run Code Online (Sandbox Code Playgroud)
我的web.xml:
<web-app>
<servlet>
<servlet-name>com.example.MyApplication</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>com.example.MyApplication</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
在客户端,我正在使用此URL:http:// localhost:8080/[projectname]/webapi/helloworld
我有这个错误:
java.lang.NullPointerException
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
java.lang.ClassLoader.loadClass(ClassLoader.java:247)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1629)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:491)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)
怎么了 ?:/我正在使用Tomcat 7.
PS:使用servlet 2.x,它可以工作:
<servlet>
<servlet-name>Jersey Web Application</servlet-name> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JAX-RS创建和部署RESTful Web服务并将其部署到tomcat.我不想使用任何IDE.在Tomcat中,我在webapps中有以下目录结构
notifire\WEB-INF\
|
---> web.xml
|
---> \classes/Notifier.class
|
---> \lib\javax.ws.rs-api-2.0
Run Code Online (Sandbox Code Playgroud)
我的web.xml包含:
<servlet>
<servlet-name>Web Service Servlet</servlet-name>
<servlet-class>javax.ws.rs.core.Application</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Web Service Servlet</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
并且从文件Notifier.class中编译了类文件Notifier.java.
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
@Path("notifier")
public class Notifier {
@Context
private UriInfo context;
@GET
@Produces("text/html")
public String getHTML() {
return "<p></p>";
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试访问Web服务时,http://localhost:8080/notifire/webservice/notifier我收到以下错误:
--type异常报告
--message类javax.ws.rs.core.Application不是Servlet
--description服务器遇到内部错误,导致无法完成此请求.
任何帮助表示赞赏.
我本来应该是一个非常简单的“ Hello World” servlet,但无法使其正常工作。我正在使用Eclipse,Tomcat 8,Java 7和Servlet 3.1。
我看过许多教程和问题,但它们并没有完全帮助。我见过的大多数教程都谈到通过扩展HttpServlet创建servlet。我有那些工作。现在,我想尝试更简洁的注释方法。
我一直在参考本教程,但它还不完整,似乎有一些不正确或不完整的示例: 打包和部署RESTful Web服务
为什么未加载com.testing.service.MyApplication?
非常感谢您对此程序的运行提供任何帮助!
这是我的文件:
MyApplication.java
package com.testing.service;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("app")
public class MyApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(HelloWorldResource.class);
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
HelloWorldResource.java
package com.testing.service;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/helloworld")
public class HelloWorldResource {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L;
@GET
@Produces("text/plain")
public String sayHello() {
return "Hello World!";
}
}
Run Code Online (Sandbox Code Playgroud)
web.xml …
我试图在没有 web.xml 配置的情况下部署一个非常简单的 jaxrs 应用程序,但无法使其工作。我希望访问的 URL 是 serverandport/{appname}/rest/welcomes/hello,我想我一定遗漏了一些显而易见的东西。
应用
@ApplicationPath("/rest")
public class EngineApp extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(RestTestImpl.class);
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
资源
@Path("/welcomes")
public class RestTestImpl {
@GET
@Path("hello")
public String sayPlainHello() {
return "Hi from Rest";
}
}
Run Code Online (Sandbox Code Playgroud)
POM 片段
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
Run Code Online (Sandbox Code Playgroud)
编辑:对于下面的响应,我尝试使用空的 web.xml 以及以下 web.xml。麻烦也返回 404,但是下面的 xml 声明“Servlet javax.ws.rs.core.Application 不可用”:
网页.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JX-RS创建Java EE应用程序.我使用以下配置工作:
@ApplicationPath("rs")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<>();
// register root resource
classes.add(ProbeREST.class);
return classes;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我更喜欢使用web.xml进行配置.我认为与简单的xml配置相比,上面的内容非常难看,如下所示:
<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-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试部署应用程序时,收到错误:
Exception while deploying the app [my_app] : There is no web component by the name of javax.ws.rs.core.Application here.
Run Code Online (Sandbox Code Playgroud)
我该如何防止此错误?
java ×6
jax-rs ×4
jersey ×4
tomcat ×3
rest ×2
servlet-3.0 ×2
glassfish ×1
glassfish-4 ×1
jersey-2.0 ×1
servlets ×1
tomcat7 ×1
web-services ×1
web.xml ×1