Java 灰熊球衣吞咽异常
最后,我正在使用quickstart原型构建Jersey Moxy服务。我的代码运行良好,可以返回一些JSON。然而,在开发过程中,如果我犯了一个错误,比如请求处理程序有一个不受支持的类型,我将得到一个空的500响应,这使得调试变得困难。例如,如果我用@XmlElementRef错误地修饰了一个属性,我将得到如下响应:Java 灰熊球衣吞咽异常,java,exception,logging,jersey,grizzly,Java,Exception,Logging,Jersey,Grizzly,最后,我正在使用quickstart原型构建Jersey Moxy服务。我的代码运行良好,可以返回一些JSON。然而,在开发过程中,如果我犯了一个错误,比如请求处理程序有一个不受支持的类型,我将得到一个空的500响应,这使得调试变得困难。例如,如果我用@XmlElementRef错误地修饰了一个属性,我将得到如下响应: $ curl -i http://localhost:8080/myapp/test HTTP/1.1 500 Internal Server Error Date: Thu,
$ 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;
}
}
}
感谢您的建议。异常未传播到Grizzly层,因此应由Jersey记录。我还没有找到您必须启用哪种类型的日志记录程序,但看起来自定义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();
}
}
导入javax.ws.rs.WebApplicationException;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.ext.ExceptionMapper;
导入javax.ws.rs.ext.Provider;
导入org.glassfish.grizzly.utils.Exceptions;
@提供者
公共类MyExceptionMapper实现
例外情况{
@凌驾
公众响应(WebApplicationException例外){
返回Response.status(500).entity(Exceptions.getStackTraceAsString(ex)).type(“text/plain”)
.build();
}
}
正如您所看到的,Grizzly使用java.util.logging
。如果想查看stacktrace,需要确保在log.conf
文件中正确设置了级别
以下是过去对我有效的设置:
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=ALL
.level=ALL
org.glassfish.level=CONFIG
“…如果我用@XmlElementRef错误地修饰属性…”我也有同样的问题。即使日志记录一直在增加,我也没有得到任何关于我的JAXB注释到底出了什么问题的信息。我打开了。我使用了这种方法,我发现它工作得很好。这在我为
异常添加了一个额外的异常apper
中也进行了讨论。在我的场景中,RuntimeException
s丢失,现在我可以记录它们并控制输出。我需要将org.glassfish.level=CONFIG
更改为org.glassfish.level=ALL
,以获取所有异常。
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=ALL
.level=ALL
org.glassfish.level=CONFIG