java - JAX-RS 与 Jersey 和灰熊 : 500 Request failed for all requests

标签 java azure jersey jax-rs grizzly

我需要在java上开发简单的Web服务。 我是 java 技术新手,根据几篇文章决定使用 JAX-RS (Jersey) 和嵌入式 http 服务器 (Grizzly2),因为它看起来适合构建 REST 服务,并且部署似乎很简单。

在我的开发环境中,一切都很完美(使用 IntllijIdea)。

但是当我尝试在测试服务器上部署时,每个请求都会返回“500 内部错误”(甚至/application.wadl)

这里有更多信息:

简单资源

@Path("resource")
public class SpeechRecognition {
    @GET
    public Response test() {
        Logger.getGlobal().log(Level.INFO, "resource test");
        return Response.ok("success", MediaType.TEXT_PLAIN).build();
    }
}

简单的资源配置

public class SimpleApiServer extends ResourceConfig {
    public SimpleApiServer() {
        register(MultiPartFeature.class);
        register(LoggingFilter.class);
        register(JacksonFeature.class);

        property(ServerProperties.TRACING, "ALL");
        property(ServerProperties.TRACING_THRESHOLD, "VERBOSE");

        packages("com.mydomain");
    }
}

简单的应用程序启动

public static void main(String[] args) throws IOException {
    final HttpServer server = GrizzlyHttpServerFactory.createHttpServer("http://0.0.0.0:80", new SimpleApiServer());

    System.out.println(String.format("Jersey app started with WADL available at "
            + "%sapplication.wadl\nHit enter to stop it...", serverUri.toString()));
    System.in.read();
    server.stop();
}

异常映射

@Provider
public class AppExceptionMapper implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable ex) {
        Logger.getGlobal().log(Level.WARNING, "exception response");

        ex.printStackTrace();

        return Response.status(500).entity(Exceptions.getStackTraceAsString(ex)).type("text/plain")
            .build();
    }
}

发生了什么

对于我在控制台中看到的每个请求

- grizzly 接受它(打印有关标题等的所有信息) - 并且执行该资源代码(打印“资源测试”)

仅此而已。

在 postman 中,我收到“500 请求失败”, header 中没有来自 Jersey 的任何跟踪(尽管我指定了属性(ServerProperties.TRACING,“ALL”);)

服务器控制台中没有打印有关任何异常的信息。

我有一个想法,当 Jersey 试图将 react 传递给灰熊时,会发生一些不好的事情。

有谁知道我应该在哪里解决这个问题?我真的坚持了下来。

我真的不想将所有内容(不是这个简单的错误示例,而是更多)重写为传统的面向 java servlet 的代码(因为这是另一项需要学习的技术)

附注

测试服务器 - 是 azure Linux VM 上的 docker 容器。请求由 nginx 代理到暴露的 docker 端口。使用相同的方案在 Rails 上建立网站,效果很好。

当 grizzly 打印有关请求的信息时,它会打印错误的主机名。 IE。实际主机名是 test.api.mydomain.com 并且 grizzly 写入 GET http://test.api:80/resource

最佳答案

好的。
这是开发和测试环境中的 Jersey 版本不匹配。

Remote debugging (与 IntellijIdea )表明,在形成响应的过程中

Exception: AbstractMethodError: javax.ws.rs.core.Response.getStatusInfo()Ljavax/ws/rs/core/Response$StatusType;

被抛出,这导致我this邮政。
修复依赖关系后一切正常。

关于java - JAX-RS 与 Jersey 和灰熊 : 500 Request failed for all requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33592348/

相关文章:

java - Spring webflux 中处理条件响应的正确方法是什么

java - 当子类化数组适配器时,无法从多 ListView 中获取选定的项目

java 整数没有按预期工作

java - Selenium/Java 退出 while 循环

azure - 无法从 REST API 获取 Azure 监控指标

asp.net-mvc - 避免删除 Web Publish 上的文件夹

java - Jersey:根据文件扩展名或 InputStream 设置响应内容类型?

java - RESTful API (java jersey) 的认证和授权

java - 使用 Jersey 运行 Rest 客户端

azure - Microsoft Graph Api 列表ownedObjects - 应用程序