【问题标题】:Grizzly Jersey swallowing exceptionsGrizzly Jersey 吞咽异常
【发布时间】:2013-09-09 03:42:30
【问题描述】:

最后,我正在使用快速入门原型构建 Jersey Moxy 服务。我的代码工作正常,我可以返回一些 JSON。但是,在我开发的过程中,如果我犯了一个错误,比如请求处理程序的类型不受支持,我将得到一个空的 500 响应,这使得调试变得困难。例如,如果我用@XmlElementRef 错误地装饰了一个属性,我会得到如下响应:

$ curl -i http://localhost:8080/myapp/test
HTTP/1.1 500 Internal Server Error
Date: Thu, 05 Sep 2013 10:27:55 GMT
Connection: close
Content-Length: 0

服务器将表现得好像没有任何问题:

Sep 5, 2013 11:27:46 AM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Jersey app started with WADL available at http://localhost:8080/application.wadl
Hit enter to stop it...

我尝试使用日志配置文件:

-Djava.util.logging.config.file=log.conf

这会产生大量输出,但仍然没有显示任何异常。

我已尝试查看 Grizzly 配置,但找不到关闭优雅错误处理的方法。理想情况下,我希望服务器抛出异常。关于我缺少什么的任何建议?

这是我的主要代码:

import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
import org.glassfish.jersey.server.ResourceConfig;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import java.io.IOException;
import java.net.URI;
import java.util.*;

public class Main {
    // Base URI the Grizzly HTTP server will listen on
    public static final String BASE_URI = "http://localhost:8080/";

    /**
     * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
  * @return Grizzly HTTP server.
   */
   public static HttpServer startServer() {
       // create a resource config that scans for JAX-RS resources and providers
       // in com.myapp package
       final ResourceConfig rc = new ResourceConfig().packages("com.myapp").registerInstances(new JsonMoxyConfigurationContextResolver());

       // create and start a new instance of grizzly http server
       // exposing the Jersey application at BASE_URI
       return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
   }

   /**
    * Main method.
     * @param args
  * @throws IOException
   */
   public static void main(String[] args) throws IOException {
       final HttpServer server = startServer();
       System.out.println(String.format("Jersey app started with WADL available at "
               + "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
       System.in.read();
       server.stop();
   }

   @Provider
   final static class JsonMoxyConfigurationContextResolver implements ContextResolver<MoxyJsonConfig> {

       @Override
       public MoxyJsonConfig getContext(Class<?> objectType) {
           final MoxyJsonConfig configuration = new MoxyJsonConfig();

           Map<String, String> namespacePrefixMapper = new HashMap<String, String>(1);
           namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");

           configuration.setNamespacePrefixMapper(namespacePrefixMapper);
           configuration.setNamespaceSeparator(':');

           return configuration;
       }
   }
}

代码与此处的示例几乎相同:

https://github.com/jersey/jersey/tree/2.2/examples/json-moxy/src/main/java/org/glassfish/jersey/examples/jsonmoxy

我使用的完整原型生成:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.myapp -DartifactId=yarese-service -Dpackage=com.myapp \
-DarchetypeVersion=2.2

非常感谢您的建议。

【问题讨论】:

  • "...如果我用@XmlElementRef 错误地装饰了一个属性..." 我遇到了同样的问题。即使日志记录一直向上,我也没有得到任何关于我的 JAXB 注释到底出了什么问题的信息。我打开了this Jersey issue

标签: java exception logging jersey grizzly


【解决方案1】:

异常不会传播到 Grizzly 层,因此应该由 Jersey 记录。我还没有找到您必须启用哪种 Logger,但看起来自定义 ExceptionMapper 可以提供帮助。

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.glassfish.grizzly.utils.Exceptions;

@Provider
public class MyExceptionMapper  implements
        ExceptionMapper<WebApplicationException> {
    @Override
    public Response toResponse(WebApplicationException ex) {
        return Response.status(500).entity(Exceptions.getStackTraceAsString(ex)).type("text/plain")
                .build();
    }
}

【讨论】:

  • 我使用了这种方法,我发现它工作得很好。这也在stackoverflow.com/questions/19621653/… 中进行了讨论
  • 我为Exception 添加了一个额外的ExceptionMapper 作为一个包罗万象的内容。在我的场景中RuntimeExceptions 丢失了,现在我可以记录它们并控制输出。
【解决方案2】:

如您所见,Grizzly 使用java.util.logging。如果您想查看堆栈跟踪,您需要确保在 log.conf 文件中正确设置了级别。

以下是过去对我有用的设置:

handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=ALL
.level=ALL
org.glassfish.level=CONFIG

【讨论】:

  • 我需要将 org.glassfish.level=CONFIG 更改为 org.glassfish.level=ALL 以获取所有异常。
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
相关资源
最近更新 更多