2012-06-26 31 views
3

我在我的項目中使用了javax.validation API,並且在某些開發人員計算機和測試服務器上存在標題問題。在其他開發人員機器上,儘管我們使用的是由Maven處理的相同Glassfish版本,IDE和庫堆棧,但無法再現此錯誤。找不到可用於類型的驗證程序:java.lang.Object

在調試這個問題,我們猜測這可能是問題的原因(不能編譯的類裏面調試,因此「疑似」) - 我們有一個接口,用於我們的持久化的實體:

public interface PersistableEntity<T> { 

    public T getId(); 

    public void setId(T id); 
} 

實現類按'id'字段類型拆分:StringBigDecimal@Pattern約束連接到PersistableEntity<String>實現中id字段的獲取方。

如果這是原因,是否可以使用javax.validation來維護驗證,並在同一時間使用泛型?

更新 我們決定從JSR303移動到自定義配置的驗證機制。如果有問題的人發現它是解決方案,請讓我知道它是哪一個,我會將其標記爲答案(歡迎來自經驗豐富的SO用戶的任何其他解決方案以避免這種困境)。

+0

貴國是否能實現這個PersistableEntity接口的實體? ([SSCCE(http://sscce.org/)) – sp00m

+0

@ sp00m,我們有持久化的實體大層次樹,並在年底有比較大的POJO類,這將是很難在這裏一一列舉下來的。 –

回答

0

我通常使用Spring Data的Persistable接口,但這個想法似乎與你的習慣一樣。

比方說,我user表有兩個字段:user_id(PK)和email(NN)。然後JAVA User實體將有一個getUserId()獲取者和一個getEmail()之一。

當實現Persistable接口,getId()吸氣劑必須重寫,而表user不包含id字段。你可以明確地告訴JAVA對應的表不使用@Transient註釋包含這樣一個字段:

@Entity 
@Table(name = "user") 
public class User implements Persistable<Integer> { 

    // Persistable implementation 

    @Override 
    @Transient // <-- means "not a database field" 
    public Integer getId() { 
     return getUserId(); 
    } 

    // user_id 

    @Column(name = "user_id", precision = 10) 
    @GeneratedValue 
    @Id 
    public Integer getUserId() { 
     return userId; 
    } 

    // email 

    @NotNull 
    @Column(name = "email", nullable = false, unique = true) 
    public String getEmail() { 
     return email; 
    } 

} 

也許這可以解決你的問題。

+0

現在這個問題已經過時了,但無論如何謝謝:)我認爲其他人有同樣的問題會發現你的答案有幫助。 –

相關問題