【问题标题】:HIbernate doesn't throw exception or show errorsHIbernate 不会抛出异常或显示错误
【发布时间】:2015-10-27 20:52:17
【问题描述】:

我正在使用 Jersey 和 Hibernate 开发一个小型 REST Web 服务器。在此过程中,我代表 Hibernate 遇到了一些奇怪的行为。即,在 curl 发出 POST 请求后尝试 Session.save() 对象时,服务器回复 500,但我在命令窗口中看不到任何错误。

但是当我切换断点并在光标上执行一步时,游标会在依赖项中的一些 jar 中运行,我最终会在其中找到错误消息。仍然没有在任何地方显示。

如何强制休眠显示所有这些错误?还是需要设置泽西岛?

我切换断点的方法:

@POST
@Path("{id}/comments/new")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response handlePostNewComment(@PathParam("id") int taskId, ItemComment newComment) {
    newComment.setItemId(taskId);
    Session s = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = s.beginTransaction();
    **Integer newCommentId = (Integer)s.save(newComment);**
    s.flush();
    tx.commit();
    s.close();
    HashMap res = new HashMap();
    res.put("id", newCommentId);
    return Response.status(201).entity(res).build();
}

服务器对 curl 的响应:

$ curl -i -X POST -H "Content-type: application/json" --data @comm.json localhost:8000/task/19/cmets/new

HTTP/1.1 500 请求失败。 内容类型:text/html;charset=ISO-8859-1 日期:格林威治标准时间 2015 年 10 月 27 日星期二 20:34:16 连接:关闭 内容长度:1033

IntelliJ 控制台中的消息:

Connected to the target VM, address: '127.0.0.1:57501', transport: 'socket'
task tracker enterprise Edition running
Oct 27, 2015 9:34:12 PM org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [localhost:8000]
Application started.
Stop the application using CTRL+C
Oct 27, 2015 9:34:12 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Oct 27, 2015 9:34:14 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.2.Final}
Oct 27, 2015 9:34:14 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Oct 27, 2015 9:34:14 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Oct 27, 2015 9:34:14 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
Oct 27, 2015 9:34:14 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Oct 27, 2015 9:34:14 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5432/tracker]
Oct 27, 2015 9:34:14 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=cristian, password=****}
Oct 27, 2015 9:34:14 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
Oct 27, 2015 9:34:14 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
Oct 27, 2015 9:34:14 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL94Dialect
Oct 27, 2015 9:34:15 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Oct 27, 2015 9:34:15 PM org.hibernate.type.BasicTypeRegistry register
INFO: HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@43aa6671
Oct 27, 2015 9:34:15 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory

在成功的请求上看起来是一样的,除了一些从休眠中回显的 SQL。

在调试时,我终于在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher 类的某个地方遇到了异常

java.lang.ClassCastException: java.lang.Long 无法转换为 java.lang.Integer

这已经发生了好几次,出现不同的错误消息。

如何强制这些组件在标准输出或标准错误上显示错误消息?或者将它们记录在某个地方?

【问题讨论】:

    标签: java hibernate jersey


    【解决方案1】:

    像这种情况我只是注册一个ExceptionMapper&lt;Throwable&gt;。这些用于将异常映射到Responses。有时,如果有未处理的异常,Jersey 会吞下它,向客户端发送有时无用的 500 服务器错误。在这些情况下,ExceptionMapper 将允许我们自己处理它,至少在发送响应之前打印堆栈跟踪

    @Provider
    public class DebugExceptionMapper implements ExceptionMapper<Throwable> {
    
        @Overrride
        public Response toResponse(Throwable e) {
            e.printStackTrace();
            return Response.serverError()
               .entity(e.getMessage())
               .build();
        }
    }
    

    另见:

    【讨论】:

    • 这解决了它。非常感谢,抱歉确认晚了。你知道这是否是泽西岛的记录行为,即他们说服务器代码不会向调用它的代码抛出异常(我自己的)?
    猜你喜欢
    • 1970-01-01
    • 2013-08-02
    • 2020-03-15
    • 2012-05-23
    • 2014-07-27
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多