Java 带嵌入式服务器的JAX-RS

Java 带嵌入式服务器的JAX-RS,java,rest,jax-rs,embedded-server,Java,Rest,Jax Rs,Embedded Server,澄清:这个问题是关于gzip一个基于JAX-WS的REST服务的,但是我决定改变话题,让它更容易找到 我通过JAX-WS提供者实现REST服务,并使用标准的端点发布它(原因是我希望避免使用servlet容器或应用程序服务器) 如果存在Accept Encoding:gzip,是否有方法使服务器对gzip响应内容有效 操作 nicore提供的示例实际上是可行的,它允许您在嵌入式轻量级服务器上构建JAX-RS样式的服务器,而无需servlet容器,但需要考虑的时间很少 如果您希望自己管理类(并在启

澄清:这个问题是关于gzip一个基于JAX-WS的REST服务的,但是我决定改变话题,让它更容易找到

我通过JAX-WS
提供者实现REST服务,并使用标准的
端点发布它(原因是我希望避免使用servlet容器或应用程序服务器)

如果存在
Accept Encoding:gzip
,是否有方法使服务器对gzip响应内容有效


操作 nicore提供的示例实际上是可行的,它允许您在嵌入式轻量级服务器上构建JAX-RS样式的服务器,而无需servlet容器,但需要考虑的时间很少

如果您希望自己管理类(并在启动过程中节省时间),可以使用以下方法:

例子 JAX-RS hello世界级:

@Path("/helloworld")
public class RestServer {

    @GET
    @Produces("text/html")
    public String getMessage(){
        System.out.println("sayHello()");
        return "Hello, world!";
    }
}
主要方法:

对于服务器:

用于:

已解决的依赖项: 简单:

  • 本身
灰熊:

  • (不同的存储库!)
泽西岛:

通知
确保
javax.ws.rs
归档文件没有进入您的类路径,因为它与Jersey的实现冲突。这里最糟糕的是一个没有日志记录的无提示404错误-只记录了
FINER
级别上的一个小注释。

如果您真的想用Java实现REST,我建议您使用JAX-RS实现(RESTeasy,Jersey…)

如果主要关注的是对servlet容器的依赖性,那么可以使用JAX-RS将应用程序注册为JAX-RS端点

// Using grizzly as the underlaying server
SelectorThread st = RuntimeDelegate.createEndpoint(new MyApplication(), SelectorThread.class);

st.startEndpoint();

// Wait...
st.stopEndpoint();
关于
GZIP
编码,每个JAX-RS提供者都有不同的方法。Jersey提供透明地完成编码。放松点

编辑

我做了一些小测试。假设您正在使用,以下两件事肯定对您有效

使用Jersey+SimpleServer:

    public static void main( String[] args ) throws Exception {

    java.io.Closeable server = null;

    try {
        // Creates a server and listens on the address below.
        // Scans classpath for JAX-RS resources
        server = SimpleServerFactory.create("http://localhost:5555");
        System.out.println("Press any key to stop the service...");
        System.in.read();
    } finally {
        try {
            if (server != null) {
                server.close();
            }
        } finally {
            ;
        }
    }
}
使用maven依赖项

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.10</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-simple-server</artifactId>
    <version>1.10</version>
</dependency>
使用maven依赖项

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.10</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-grizzly2</artifactId>
    <version>1.10</version>
</dependency>

泽西岛
球衣核心
1.10
泽西岛
泽西灰熊2
1.10
老实说,我也无法让
RuntimeDelegate
示例正常工作。
当然也有一种方法可以让RESTEasy开箱即用,但我现在想不起来了

gzip输出是JAX-WS实现的责任。为了配置http网络侦听器,您应该参考服务器(Tomcat、Glassfish、JBoss等)文档

如果在JAX-WS实现(或JAX-RS)中使用CXF,您可以将@GZIP注释添加到服务类中。

这不是由容器(Tomcat、Jetty等)来解决吗?我们目前没有使用servlet containe,而REST服务可能是我们唯一需要它的地方。我真的不认为仅仅为了gzip这个小家伙而检查、设置和调优整个servlet容器是值得的。因此,如果可能的话,我想避免使用一个。为了清楚起见,这些示例适用于Jersey 1.x,而对于Jersey 2.x则不准确。关于后一种情况,请参阅文档:很抱歉,但是JAX-RS(尤其是它的
RuntimeDelegate
)是我见过的最可怕、设计最糟糕的东西之一。我为Jersey和RESTEasy苦苦挣扎了两个小时,仍然不知道如何在没有servlet容器的情况下让它们工作。你能提供一个简单的例子来说明如何实现这一点吗?注意:顺便问一下,哪个罐子包含
SelectorThread
?Grizzly本身有很多罐子,而Jersey似乎没有这个。嗯,我个人喜欢JAX-RS,并用它制作了一些非常酷的东西。至少这是一个比自己开发所有东西更好的选择。关于JAR问题:我无法给出答案,因为我使用maven来为我解决这个问题。也许泽西岛的维基页面会有所帮助。花了些时间来解决这个问题,但它确实有效,谢谢。我会接受你的回答并编辑我的问题,以澄清这一点。可能会添加到我的necro徽章上,但这又是怎么回事!jersey抛出了一个异常——“ResourceConfig实例不包含任何根资源类”,我想这不需要web.xml,这是我尝试过的方法之一。使用jersey simple server 1.17.1
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.10</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-simple-server</artifactId>
    <version>1.10</version>
</dependency>
public static void main(String[] args) throws Exception {

    HttpServer server = null;

    try {
        server = GrizzlyServerFactory.createHttpServer("http://localhost:5555");
        System.out.println("Press any key to stop the service...");
        System.in.read();
    } finally {
        try {
            if (server != null) {
                server.stop();
            }
        } finally {
            ;
        }
    }
}
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.10</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-grizzly2</artifactId>
    <version>1.10</version>
</dependency>