私は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)
プロジェクトの構造を以下に提供され、
以下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;
}
}
ここで問題と解決方法を教えてください。
誰かが質問を閉じる理由を提示している場合は、質問を更新できます。私にとっては、これは正当なプログラミング問題であり、解決する必要があります。 – Arefe
メッセージはクリアです。 'id'と' currency'はNULLであってはいけません。 – Zico
可能な解決策(あなたのデータベースは言及していませんでした): 'Generation'.IDENTITYの' id'カラムがAUTO INCREMENTEDであることを確認し、 'currency'をNULLとして保存したい場合は、カラムにNULLデータを保存できます。 – Zico