为什么获取____不能为空



我正在学习阶段,刚刚开始制作包含单个实体的小应用程序。在邮差测试时,我一直得到一个错误:列'account_number'不能为空虽然我输入accountNumber。我遵循实体&以下相关分类:我的借口,如果我错过了一些东西,由于缺乏知识。谢谢你的建议

PrimaryAccount

@Entity
@Table(name = "primary_account")
public class PrimaryAccount {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "account_number")
private String accountNumber;
@Column(name = "account_balance")
private BigDecimal accountBalance;
@OneToMany(mappedBy = "primaryAccount", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JsonIgnore
private List<PrimaryTransaction> primaryTransactionList;
Getter&Setting&Constructor

AccountService

public interface AccountService {
ResponseEntity<String> createPrimaryAccount();
}

AccountServiceImpl

@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private PrimaryAccountDao primaryAccountDao;
public ResponseEntity<String> createPrimaryAccount() {
PrimaryAccount primaryAccount = new PrimaryAccount();
primaryAccount.setAccountNumber(primaryAccount.getAccountNumber());
primaryAccount.setAccountBalance(primaryAccount.getAccountBalance());
primaryAccountDao.save(primaryAccount);
return ResponseEntity.ok("Record entered");
}

@ controller公共类AccountController {

@Autowired
private AccountService accountService;
@PostMapping("/primaryAccount")
public ResponseEntity<String> primaryAccount(PrimaryAccount primaryAccount) {
return accountService.createPrimaryAccount();
}

PrimarAccountDao

public interface PrimaryAccountDao extends CrudRepository<PrimaryAccount, Long> {
PrimaryAccount findByAccountNumber (long accountNumber);
}

在邮差这边,我只做如下修改:

{
"AccountNumber": "89000",
"AccountBalance": 2000.00
}

错误:

java.sql.SQLIntegrityConstraintViolationException: Column 
'account_number' cannot be null
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException
(SQLError.java:117) ~[mysql-connector-java-8.0.26.jar:8.0.26]
at 
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException
(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.26.jar:
8.0.26]at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal
(ClientPreparedStatement.java:953) ~[mysql-connector-java- 
8.0.26.jar:8.0.26]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal
(ClientPreparedStatement.java:1092) ~[mysql-connector-java- 
8.0.26.jar:8.0.26]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal
(ClientPreparedStatement.java:1040) ~[mysql-connector-java- 
8.0.26.jar:8.0.26]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate
(ClientPreparedStatement.java:1350) ~[mysql-connector-java- 
8.0.26.jar:8.0.26]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate
(ClientPreparedStatement.java:1025) ~[mysql-connector-java- 
8.0.26.jar:8.0.26]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate
(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate
(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.
executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.insert
(AbstractEntityPersister.java:3298) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.insert
(AbstractEntityPersister.java:3825) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.action.internal.EntityInsertAction.execute
(EntityInsertAction.java:107) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at 
org.hibernate.engine.spi.ActionQueue.executeActions
(ActionQueue.java:604) 
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1
(ActionQueue.java:478) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) 
~ na:na]
at org.hibernate.engine.spi.ActionQueue.executeActions
(ActionQueue.java:475) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.event.internal.AbstractFlushingEventListener.
performExecutions(AbstractFlushingEventListener.java:344) ~ 
[hibernate- 
core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush
(DefaultFlushEventListener.java:40) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.event.service.internal.EventListenerGroupImpl.
fireEventOnEachListener(EventListenerGroupImpl.java:99) ~[hibernate- 
core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.internal.SessionImpl.doFlush
(SessionImpl.java:1362) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at 
org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453) 
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at 
org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion
(SessionImpl.java:3212) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion
(SessionImpl.java:2380) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.
beforeTransactionCompletion(JdbcCoordinatorImpl.java:448) ~ 
[hibernate- 
core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.
JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletion
Callback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.
JdbcResourceLocalTransactionCoordinatorImpl.access$300
(JdbcResourceLocalTransactionCoordinatorImpl.java:40) ~[hibernate- 
core- 
5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.
JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriver
ControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.
java:281) 
~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
at org.hibernate.engine.transaction.internal.TransactionImpl.commit
(TransactionImpl.java:101) ~[hibernate-core- 
5.4.32.Final.jar:5.4.32.Final]
at org.springframework.orm.jpa.JpaTransactionManager.doCommit
(JpaTransactionManager.java:562) ~[spring-orm-5.3.10.jar:5.3.10]
at 
org.springframework.transaction.support.AbstractPlatformTransaction
Manager.processCommit(AbstractPlatformTransactionManager.java:743) ~ 
[spring-tx-5.3.10.jar:5.3.10]

您正在实例化primaryAccount并使用它已经具有的值设置它,该值实际上为null。您需要将参数从Controller传递给Service,如下所示:

public interface AccountService {
ResponseEntity<String> createPrimaryAccount(PrimaryAccount primaryAccount);
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private PrimaryAccountDao primaryAccountDao;
public ResponseEntity<String> createPrimaryAccount(PrimaryAccount primaryAccount) {
primaryAccountDao.save(primaryAccount);
return ResponseEntity.ok("Record entered");
}
@Controller 
public class AccountController {
@Autowired
private AccountService accountService;
@PostMapping("/primaryAccount")
public ResponseEntity<String> primaryAccount(@RequestBody PrimaryAccount primaryAccount) {
return accountService.createPrimaryAccount(primaryAccount);
}
}

你的JSON必须更改为:

{
"accountNumber": "89000",
"accountBalance": 2000.00
}

为什么?除非您使用一些@JsonProperty注释,否则JSON中的属性必须与模型中的每个属性的名称相匹配。

一个建议:使用dto的实体在控制器层。你可以在这里看到一些原因。

你的项目有基本的编程基本问题。像这样更新你的项目

public interface AccountService {
ResponseEntity<String> createPrimaryAccount(PrimaryAccount primaryAccount);
}
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private PrimaryAccountDao primaryAccountDao;
public ResponseEntity<String> createPrimaryAccount(PrimaryAccount primaryAccount) {
primaryAccountDao.save(primaryAccount);
return ResponseEntity.ok("Record entered");
}
}
@Autowired
private AccountService accountService;
@PostMapping("/primaryAccount")
public ResponseEntity<String> primaryAccount(@RequestBody PrimaryAccount primaryAccount) {
return accountService.createPrimaryAccount(primaryAccount);
}

相关内容

最新更新