当前位置: 首页 > 知识库问答 >
问题:

灰熊泽西吞咽例外

上官高逸
2023-03-14

我正在使用quickstart原型构建一个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 config,但是我找不到关闭优雅的错误处理的方法。理想情况下,我希望服务器抛出一个异常。关于我错过了什么有什么建议吗?

这是我的主要代码:

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

感谢您的建议。

共有2个答案

狄阳华
2023-03-14

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

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

handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=ALL
.level=ALL
org.glassfish.level=CONFIG
归建安
2023-03-14

这个异常没有传播到Grizzly层,所以应该由Jersey来记录。我还没有找到你必须启用哪种日志记录器,但是看起来自定义异常映射器可能会有所帮助。

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();
    }
}
 类似资料:
  • 目前我在灰熊2.3.16和泽西2.14工作。我试图得到一个自定义异常处理的服务器和返回到客户端。相反,我似乎得到了通用的灰熊错误,即使正确的代码似乎被调用。 这是筛选器方法(具有“@Provider”装饰的类的一部分)。 下面是整个ExceptionMapper实现: 下面是我如何得到回复并阅读的: 当我得到实体时,它是来自Grizzly的HTML,而不是我的自定义消息。 这是调用toRespon

  • 我已经设法在Jersey,HK2和一个普通的GrizzlyServer中设置了我自己的服务类的注入(到资源类中)。(基本上遵循了这个例子。) 我现在很好奇将JPA EntityManager注入我的资源类中的最佳方法是什么?(我目前正在考虑一个请求作为一个工作单元)。我目前正在研究的一个选项是以以下方式使用: null (我不想仅仅为了覆盖这个用例而依赖于重量级容器或额外的依赖注入库。)

  • 我一直在玩CompletableFuture,发现了一件奇怪的事情。 如果在我的thenAccept调用中,断言失败,则不会传播异常。当时我尝试了更丑陋的东西: 不会发生任何事情,不会传播任何异常。我尝试使用诸如handle等方法以及与CompletableFutures中异常相关的其他方法,但失败了-没有一个方法像预期的那样传播异常。 当我调试CompletableFuture时,它会捕获如下异

  • 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 为空。我可以将上下文注入到被调用的实际endpoint中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端找到这个对象。 必须有一种简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于灰熊,或者注入了RESTendpoint调

  • 我正在实现Swagger以生成API文档。我在这里遵循配置指南:https://github.com/wordnik/swagger-core/wiki/Java-JAXRS-Quickstart但它都是基于XML的,当我尝试做我认为在运行时配置中等效的事情时,Grizzly抱怨-无法解析方法“addServlet(java.lang.String,com.wordnik.swagger.jers

  • 嗨,我在运行gulp watch时遇到这个错误。我在拉拉维尔项目中使用vueify。为什么会发生这种情况。这几天工作得很好,今天收到了。 这是我的gulpfile.js