我正在创建我的第一个JSF+EJB
应用程序测试,当我以jsf形式插入基本数据时点击<p:commandButton/>
,除了一个输入外,任务正确完成。在表单中,我有2个输入字段,#1在我的db.table中设置为VARCHAR
,#2是INT
,但它们都是<p:inputText/>
。与他们的对应和EL
。
在验证DB中持久保存的信息时,只有#1字段正确存在,#2设置为,我不明白为什么。
我已经完成了以前的应用程序,我使用Hibernate
来保持持久性,这很好用,我在Annotation
模块中遗漏了一些@EJB
或其他内容吗?
这是我的代码:
<h:form>
<p:panelGrid columns="2" >
<p:outputLabel value="Owner"/>
<p:inputText value="#{accountMB.account.ownername}"/>
<p:outputLabel value="Balance"/>
<p:inputText value="#{accountMB.account.balance}"/>
</p:panelGrid>
<p:commandButton value="Create Account" action="#{accountMB.commandButton()}" ajax="false"/>
</h:form>
ManagedBean:
@ManagedBean
@RequestScoped
public class AccountMB {
@EJB
private AccountFacade facade;
private Account account;
public AccountMB() {
}
@PostConstruct
public void init(){
this.account = new Account();
}
// setters .. getters ...
public String commandButton(){
facade.openAccount(this.account.getOwnername(), this.account.getBalance());
return "response?faces-redirect=true";
}
}
会话bean:
@Stateless
public class AccountFacade extends AbstractFacade<Account> {
@PersistenceContext(unitName = "bankAppPU")
private EntityManager em;
@Override
protected EntityManager getEntityManager() {
return em;
}
public AccountFacade() {
super(Account.class);
}
public Account openAccount(String ownername, int balance){
Account ac = new Account(balance, ownername);
em.persist(ac);
return ac;
}
public void closeAccount(int accountNumber){
Account ac = em.find(Account.class, accountNumber);
if(ac != null)
em.remove(ac);
}
public void deposit(int accountNumber, int amount){
Account ac = em.find(Account.class, accountNumber);
if(ac != null)
ac.deposit(amount);
}
public int withdraw(int accountNumber, int amount){
Account ac = em.find(Account.class, accountNumber);
return (ac != null)? ac.withdraw(amount): 0;
}
public List<Account> listAccounts(){
return em.createNamedQuery("Account.findAll").getResultList();
}
}
实体bean:
@Entity
@Table(name = "account")
@NamedQueries({
@NamedQuery(name = "Account.findAll", query = "SELECT a FROM Account a")})
public class Account implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID")
private Integer id;
@Column(name = "BALANCE")
private Integer balance;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "OWNERNAME")
private String ownername;
public Account() {
}
public Account(Integer id) {
this.id = id;
}
public Account(Integer id, String ownername) {
this.id = id;
this.ownername = ownername;
}
// setters .. getters ..
public void deposit(int amount){
this.balance += amount;
}
public int withdraw(int amount){
return (amount > this.balance)? 0 : (this.balance-=amount);
}
}
答案 0 :(得分:0)
<p:inputText value="#{accountMB.account.balance}" converter="javax.faces.Integer" />
或
public String commandButton(){
facade.openAccount(this.account.getOwnername(), Integer.parseInt(this.account.getBalance()));
return "response?faces-redirect=true";
}
答案 1 :(得分:0)
在应用程序的几个地方打印balance
后,我的错误就在数据库本身,因为我意外地设置了BALANCE INT(11)
所以任何比它设置的格式更大的数字将是设为null
。