2017-08-20 16 views
0

私はSpring MVC RESTfulアプリで動作し、持続している間にConstraintViolationExceptionを取得します。以下に提供されたエラーメッセージ、ConstraintViolationException:永続中にクラス[.... entities.WalletInfo]の検証が失敗しました

Exception in thread " STARTING" javax.validation.ConstraintViolationException: Validation failed for classes [mobi.puut.entities.WalletInfo] during persist time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=id, rootBeanClass=class mobi.puut.entities.WalletInfo, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=currency, rootBeanClass=class mobi.puut.entities.WalletInfo, messageTemplate='{javax.validation.constraints.NotNull.message}'} 
] 
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140) 
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:80) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:197) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:75) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:626) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:280) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:261) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:306) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113) 
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132) 
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) 
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:780) 
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:765) 
    at mobi.puut.database.WalletInfoDao.create(WalletInfoDao.java:62) 
    at mobi.puut.database.WalletInfoDao$$FastClassBySpringCGLIB$$624213d.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) 
    at mobi.puut.database.WalletInfoDao$$EnhancerBySpringCGLIB$$a84b41b3.create(<generated>) 
    at mobi.puut.services.WalletService.createWalletInfo(WalletService.java:273) 
    at mobi.puut.services.WalletService.lambda$generateAddress$0(WalletService.java:97) 
    at mobi.puut.controllers.WalletManager$1.lambda$onSetupCompleted$0(WalletManager.java:109) 
    at java.lang.Iterable.forEach(Iterable.java:75) 
    at java.util.Collections$SynchronizedCollection.forEach(Collections.java:2062) 
    at mobi.puut.controllers.WalletManager$1.onSetupCompleted(WalletManager.java:109) 
    at org.bitcoinj.kits.WalletAppKit.startUp(WalletAppKit.java:325) 
    at com.google.common.util.concurrent.AbstractIdleService$2$1.run(AbstractIdleService.java:54) 
    at com.google.common.util.concurrent.Callables$3.run(Callables.java:95) 

プロジェクトの構造を以下に提供され、

enter image description here

以下provicedエラーに向けサンプルコード、

@Transactional(rollbackFor = Exception.class) 
    public WalletInfo create(String name, String address) { 

     // create the WalletInfo entity with provided name and address 
     WalletInfo walletInfo = new WalletInfo(); 
     walletInfo.setAddress(address); 
     walletInfo.setName(name); 

     // persist the created instance into the database 
     sessionFactory.getCurrentSession().persist(walletInfo); 
     return walletInfo; 
    } 


protected WalletInfo createWalletInfo(final String walletName, final String address) { 
     return walletInfoDao.create(walletName, address); 
    } 


public synchronized WalletInfo generateAddress(final String walletName, String currencyName) { 

     // get the WalletInfo entity from the database with the wallet and the currency name 
     WalletInfo walletInfo = walletInfoDao.getWalletInfoWithWalletNameAndCurrency(walletName, currencyName); 

     // generate wallet, if the wallet is not 
     // generated previously 
     if (walletInfo == null) { 

      if (genWalletMap.get(walletName) == null) { 

       logger.info("Wallet name that we are workign on {}", walletName); 

       final WalletManager walletManager = WalletManager.setupWallet(walletName); 

       walletManager.addWalletSetupCompletedListener((wallet) -> { 

        Address address = wallet.currentReceiveAddress(); 
     /*at mobi.puut.services.WalletService.lambda$generateAddress$0(WalletService.java:97) */ 

        WalletInfo newWallet = createWalletInfo(walletName, address.toString()); 

        walletMangersMap.put(newWallet.getId(), walletManager); 
        genWalletMap.remove(walletName); 
       }); 

       genWalletMap.put(walletName, walletManager); 
      } 
      return walletInfo; 
     } 
     return null; 
    } 



private void setupWalletKit(final String walletId) { 

     File directory = getWalletDirectory(walletId); 

     // if the seed is not null, that means we are restoring from the backup 
     bitcoin = new WalletAppKit(networkParameters, directory, WALLET_FILE_NAME) { 

      @Override 
      protected void onSetupCompleted() { 

       // Don't make the user wait for confirmations 
       // they're sending their own money anyway!! 
       bitcoin.wallet().allowSpendingUnconfirmedTransactions(); 
       Wallet wallet = bitcoin.wallet(); 

       model.setWallet(wallet); 

       /* lambda$onSetupCompleted$0(WalletManager.java:109) */ 
       setupCompletedListeners.forEach(listener -> listener.onSetupCompleted(wallet)); 
      } 
     }; 

     // some code 
} 

設けWalletInfoエンティティ、

@Entity 
@Table(name = "wallet_info") 
public class WalletInfo { 

    @Id 
    @Column(name = "id") 
// @NotNull 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @NotNull 
    @Column(name = "name") 
    private String name; 

    @NotNull 
    @Column(name = "address") 
    private String address; 

    @NotNull 
    @Column(name = "currency") 
    private String currency; 

    public Long getId() { 
     return id; 
    } 

    public WalletInfo(@NotNull String name, @NotNull String address, @NotNull String currency) { 
     this.name = name; 
     this.address = address; 
     this.currency = currency; 
    } 

    public WalletInfo(@NotNull String name, @NotNull String address) { 
     this.name = name; 
     this.address = address; 
    } 

    public WalletInfo() { 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 


    public String getCurrency() { 
     return currency; 
    } 

    public void setCurrency(String currency) { 
     this.currency = currency; 
    } 
} 

ここで問題と解決方法を教えてください。

+0

誰かが質問を閉じる理由を提示している場合は、質問を更新できます。私にとっては、これは正当なプログラミング問題であり、解決する必要があります。 – Arefe

+1

メッセージはクリアです。 'id'と' currency'はNULLであってはいけません。 – Zico

+1

可能な解決策(あなたのデータベースは言及していませんでした): 'Generation'.IDENTITYの' id'カラムがAUTO INCREMENTEDであることを確認し、 'currency'をNULLとして保存したい場合は、カラムにNULLデータを保存できます。 – Zico

答えて

0

コメントに記載されている解決策は正しいです、私はちょうどそれを慎重に他人、特にHibernateを新たに使用している人を助けるために書きたいと思います。 WalletInfoエンティティは、すべてのエンティティがNN非ヌルとして提供され、従って、データベース内persistingながら一致する必要がある

enter image description here

注意こと、MySQLwallet_infoテーブルと一致します。

変更後walletInfoエンティティ・クラスを、データベース層で

@Entity 
@Table(name = "wallet_info") 
public class WalletInfo { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @NotNull 
    @Column(name = "name") 
    private String name; 

    @NotNull 
    @Column(name = "address") 
    private String address; 

    @NotNull 
    @Column(name = "currency") 
    private String currency; 

    // getters and setters 


    // constructors 

public WalletInfo(@NotNull String name, @NotNull String address, @NotNull String currency) { 
     this.name = name; 
     this.address = address; 
     this.currency = currency; 
    } 

    public WalletInfo(@NotNull String name, @NotNull String address) { 
     this.name = name; 
     this.address = address; 
    } 

    public WalletInfo() { 
    } 
} 

、これは私がpersistに用いた方法であった、

@Transactional(rollbackFor = Exception.class) 
public WalletInfo create(String name, String currency, String address) { 

    // create the WalletInfo entity with provided name and address 
    WalletInfo walletInfo = new WalletInfo(); 
    walletInfo.setAddress(address); 
    walletInfo.setName(name); 
    walletInfo.setCurrency(currency); 

    // persist the created instance into the database 
    sessionFactory.getCurrentSession().persist(walletInfo); 
    return walletInfo; 
} 

私はそれゆえcurrecnyカラムとを加え、 currencynullと以前に作成した walletInfo.setCurrency(currency)行を追加することを忘れて、エラーを作成します。これは、それはまた@NotNull

@Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

の注釈を付けていなかった@NotNull注釈とエンティティパラメータ定義とコンストラクタの要素ではない私は、これは一部の人々を助けることを願っていますように私はまだidヌルを作ることができます。

関連する問題