2016-12-13 19 views
4

我有一個Actor(Play Framework,Java),用於定期執行一些數據庫數據導入。這位演員調用各種其他類,進行導入,堅持等等。我目前的問題是,我無法弄清楚生成SQL異常的確切行號和文件。舉例來說,我得到的錯誤是這樣的:找出哪一行代碼正在生成SQL異常

[info] application - javax.persistence.PersistenceException: ERROR executing DML bindLog[] error[ERROR: null value in column "email" violates not-null constraint\n Detail: Failing row contains (266, null, null, null).] 
[info] application - Starting persisting of customer id 29917837 
[error] o.j.StatementLogger - insert into emails (email, domain, user_id) values (null,null,null); 
throws exception: org.postgresql.util.PSQLException: ERROR: null value in column "email" violates not-null constraint 
    Detail: Failing row contains (268, null, null, null). 
org.postgresql.util.PSQLException: ERROR: null value in column "email" violates not-null constraint 
    Detail: Failing row contains (268, null, null, null). 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:645) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:495) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:441) 
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) 
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) 
    at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

當然,我可以看看錯誤信息,並看到一些地方試圖堅持我的電子郵件模型,而不會填充它。現在代碼庫非常小(大約200-300行),我可以很準確地猜出這是從哪裏來的。但是框架不應該報告行號?或者,也許這就是使用演員時會發生的情況,因爲他們在某種程度上是種類的,在系統之外,還有一切?

+0

事實上,你的大部分類都有行號(編譯的java代碼中的行號是可選的)。但是,這是你的整個堆棧跟蹤?哪個方法使用反射來調用HikariProxyPreparedStatement? –

+0

@SergioMontoro是的,這是整個堆棧跟蹤。實際上我使用Play框架,它使用Akka actors來安排任務。除此之外,我不知道誰在做什麼,但似乎這個框架正在使用反射。 – dotslash

回答

4

您正在使用一個框架來執行它使用反射的查詢,這使得調試非常困難。我不知道你正在使用的具體框架,但很可能它的配置可以設置爲使調試更容易。

如果不是,或者它是您自己的使用反射的代碼,您可以捕獲該異常,將其包裝並從「外部」代碼(即執行反射操作的代碼)中重新拋出異常。這將爲您提供一個額外的堆棧跟蹤,其中包含代碼中的確切位置。

例如,你可以用你的包裝代碼做到這一點:

try { 
    this.custPersister.persist(customer); 
} catch (Exception e) { 
    throw new Exception(e); 
} 

只要確保該例外被捕獲在適當的地方在你的外碼和堆棧跟蹤記錄。

+0

嗨,傑里米,我實際上使用Play框架。我已經標記了我的問題,並且現在已經將框架名稱添加到我的問題中以更加清晰。事實上,早些時候,我甚至沒有從異常報告中獲得這麼多。只有在我封裝了Actor代碼(參見http://pastebin.com/RXtQUye7)之後,我纔開始得到這麼多。 – dotslash

+2

所以你已經是那裏的大部分了。正如我將在上面解釋的那樣,改變你的包裝代碼。我會編輯我的答案。 –

+0

它改進了很多! (見http://pastebin.com/9eEDnSZ9)問題是,它現在給我的是Actor的哪一行導致錯誤。我仍然不知道哪個班造成了例外,爲什麼。但我想這就是Actors in Play框架的工作原理。 。 。我的意思是演員真的應該是不相交的單位和所有。但告訴我,爲什麼這個簡單的改變會產生更多的信息?我會接受這個答案。 :-) – dotslash

相關問題