JAX-RS 对于 Jersey & Grizzly:500 次请求对所有请求均失败
JAX-RS with Jersey & Grizzly: 500 Request failed for all requests
嗨
我需要在 java 上开发简单的 Web 服务。
我是 java 技术的新手,根据几篇文章决定使用 JAX-RS (Jersey) 和嵌入式 http 服务器 (Grizzly2),因为它看起来适合构建 REST 服务,而且部署似乎很简单。
在我的开发环境中,一切都很完美(使用 IntllijIdea)。
但是当我尝试在测试服务器上部署每个请求时 returns“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();
}
}
发生了什么
对于我在控制台中看到的每个请求
- 灰熊接受它(打印关于 headers 等的所有信息)
- 并执行该资源代码(打印 "resource test")
仅此而已。
在邮递员中,我收到“500 请求失败”,在 headers 中没有来自 Jersey 的踪迹(尽管我指定了 属性(ServerProperties.TRACING, "ALL");)
服务器控制台中没有打印有关任何异常的信息。
我有一个想法,当球衣试图将响应传递给灰熊时,会发生一些不好的事情。
有没有人对我应该去哪里解决这个问题有任何想法?我真的坚持了下来。
而且我真的不想将所有内容(不是这个简单的错误示例,而是更多)重写为传统的 java servlet-oriented 代码(因为这是另一项需要学习的技术)
P.S.
测试服务器 - 是 Azure linux VM 上的 docker 容器。请求由 nginx 代理到公开的 docker 端口。使用相同的方案在 Rails 上获得 web-site,效果很好。
当 grizzly 打印有关请求的信息时,它会打印不正确的主机名。 IE。实际主机名是 test.api.mydomain.com 并且 grizzly 写 GET http://test.api:80/resource
好的
这是开发和测试环境中的 Jersey 版本不匹配。
Remote debugging (with IntellijIdea) 显示,正在形成响应
Exception: AbstractMethodError: javax.ws.rs.core.Response.getStatusInfo()Ljavax/ws/rs/core/Response$StatusType;
被抛出,导致我 this post。
修复依赖关系后一切正常。
嗨
我需要在 java 上开发简单的 Web 服务。 我是 java 技术的新手,根据几篇文章决定使用 JAX-RS (Jersey) 和嵌入式 http 服务器 (Grizzly2),因为它看起来适合构建 REST 服务,而且部署似乎很简单。
在我的开发环境中,一切都很完美(使用 IntllijIdea)。
但是当我尝试在测试服务器上部署每个请求时 returns“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();
}
}
发生了什么
对于我在控制台中看到的每个请求
- 灰熊接受它(打印关于 headers 等的所有信息) - 并执行该资源代码(打印 "resource test") 仅此而已。在邮递员中,我收到“500 请求失败”,在 headers 中没有来自 Jersey 的踪迹(尽管我指定了 属性(ServerProperties.TRACING, "ALL");)
服务器控制台中没有打印有关任何异常的信息。
我有一个想法,当球衣试图将响应传递给灰熊时,会发生一些不好的事情。
有没有人对我应该去哪里解决这个问题有任何想法?我真的坚持了下来。
而且我真的不想将所有内容(不是这个简单的错误示例,而是更多)重写为传统的 java servlet-oriented 代码(因为这是另一项需要学习的技术)
P.S.
测试服务器 - 是 Azure linux VM 上的 docker 容器。请求由 nginx 代理到公开的 docker 端口。使用相同的方案在 Rails 上获得 web-site,效果很好。
当 grizzly 打印有关请求的信息时,它会打印不正确的主机名。 IE。实际主机名是 test.api.mydomain.com 并且 grizzly 写 GET http://test.api:80/resource
好的
这是开发和测试环境中的 Jersey 版本不匹配。
Remote debugging (with IntellijIdea) 显示,正在形成响应
Exception: AbstractMethodError: javax.ws.rs.core.Response.getStatusInfo()Ljavax/ws/rs/core/Response$StatusType;
被抛出,导致我 this post。
修复依赖关系后一切正常。