我正在使用Spring MVC进行应用程序,当我尝试将银行帐户注册到我的应用程序中的特定人员时,我遇到了问题。在这种情况下,一个人有很多帐户:
这种关系中有两个类:
Sumarizing:
@Entity
public class Pessoa {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int idPessoa;
@OneToMany(mappedBy = "pessoa", targetEntity = ContaCorretora.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<ContaCorretora> contaCorretora;
@Entity
public class ContaCorretora {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int idConta;
private TipoConta tipoConta;
private TipoRisco tipoRisco;
private String login;
private String senha;
private BigDecimal valorAtual;
@ManyToOne
@JoinColumn(name="idPessoa")
private Pessoa pessoa;
控制器类:
@RequestMapping("/pessoa")
@Controller
public class ContaCorretoraController {
@Autowired
private ContaCorretoraDAO contaCorretoraDao;
@Autowired
private PessoaDAO pessoaDao;
@RequestMapping("/pessoacorretora/{id}")
public ModelAndView pessoaCorretora(@PathVariable("id") int id, ContaCorretora contaCorretora ) {
contaCorretora = new ContaCorretora();
Map<String, Object> model = new HashMap<String, Object>();
Pessoa pessoa = pessoaDao.find(id);
model.put("contaCorretora", contaCorretora);
model.put("pessoa", pessoa);
model.put("tipoConta", TipoConta.values());
model.put("tipoRisco", TipoRisco.values());
return new ModelAndView("pessoa/contacorretora", "model", model);
}
@RequestMapping(value="/pessoacorretora/finalizar", method=RequestMethod.POST)
public ModelAndView gravar(ContaCorretora contaCorretora) {
contaCorretoraDao.gravar(contaCorretora);
return new ModelAndView("redirect:pessoa/contacorretora");
}
我真的不知道控制器类是否正确,但可能存在问题。不过,我也会粘贴JSP代码:
<form:form action="${s:mvcUrl('CCC#gravar').build() }" method="post" commandName="pessoa" enctype="multipart/form-data" >
<div class="form-group" >
<label>Conta</label>
<select name="tipoConta">
<c:forEach items="${model.tipoConta}" var="tipoConta">
<option value=${tipoConta}>${tipoConta}</option>
</c:forEach>
</select>
</div>
<div class="form-group" >
<label>Risco</label>
<select name="tipoRisco">
<c:forEach items="${model.tipoRisco}" var="tipoRisco">
<option value=${tipoRisco}>${tipoRisco}</option>
</c:forEach>
</select>
</div>
<div class="form-group">
<label>Login</label>
<form:input path="login" cssClass="form-control" />
</div>
<div class="form-group">
<label>Senha</label>
<form:input path="senha" cssClass="form-control" />
</div>
<div class="form-group">
<label>Valor Atual</label>
<form:input path="valorAtual" cssClass="form-control" />
</div>
<button type="submit" class="btn btn-primary">Cadastrar</button>
</form:form>
当我尝试打开网站时(.... / pessoa / pessoacorretora / 6) - 6是有效的ID,这是错误:
HTTP状态500 - java.lang.IllegalStateException:既不是BindingResult也不是bean名称的普通目标对象&#39; pessoa&#39;可用作请求属性 类型异常报告 message java.lang.IllegalStateException:BindingResult和bean名称的普通目标对象&#39; pessoa&#39;可用作请求属性 description服务器遇到内部错误,导致无法完成此请求。
实际上,当我想做CRUD动作时,我真的不知道如何处理两个类的关系。
答案 0 :(得分:1)
问题是spring无法绑定JSP表单中的commandName="pessoa"
。
你确定佩索阿的价值是:
Pessoa pessoa = pessoaDao.find(id); // is not Null ??
尝试这个测试:
model.put("pessoa", pessoa == null ? new Pessoa() : pessoa );
解决此问题的另一种方法是通过控制器上的模型属性注释添加它:
@ModelAttribute("pessoa ")
public Pessoa defaultInstance() {
return new Pessoa();
}