当我尝试更新表的成员时,错误
这是我的prodottocontroller:
package it.catalogo.controller;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import it.catalogo.model.Prodotto;
import it.catalogo.repository.ProdottoRepository;
@Controller
@RequestMapping("/prodotto")
public class ProdottoController {
@Autowired
private ProdottoRepository repo;
@GetMapping("/lista")
public ModelAndView list( @RequestParam(name = "id", required = false) String idProdotto, ModelMap mm) {
if(idProdotto!=null) {
Optional<Prodotto> p = repo.findById(Integer.parseInt(idProdotto));
mm.addAttribute("prodottoDaModificare",p);
}
return new ModelAndView("prodotti", "listaProdotti", repo.findAll());
}
@PostMapping("/add")
public String add(@ModelAttribute("datiProdotto") Prodotto p) {
repo.save(p);
return "redirect:/prodotto/lista";
}
@PostMapping("/update")
public String update(@ModelAttribute("datiProdotto") Prodotto p) {
repo.save(p);
return "redirect:/prodotto/lista";
}
@GetMapping("/delete")
public String delete(@RequestParam("id") String id) {
repo.deleteById(Integer.parseInt(id));
return "redirect:/prodotto/lista";
}
}
prodotto实体:
package it.catalogo.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Prodotto {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "nome")
private String nome;
@Column(name = "descrizione")
private String descrizione;
@Column(name = "prezzo")
private Integer prezzo;
public Prodotto(String nome, String descrizione, Integer prezzo) {
super();
this.nome = nome;
this.descrizione = descrizione;
this.prezzo = prezzo;
}
public Prodotto() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
public Integer getPrezzo() {
return prezzo;
}
public void setPrezzo(Integer prezzo) {
this.prezzo = prezzo;
}
}
这是视图(freemarker):
<!DOCTYPE html>
<html>
<head>
<title>Catalogo prodotti</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</head>
<body>
<h1>Catalogo prodotti</h1>
<#if prodottoDaModificare?? >
<h2>Modifica del prodotto - ${prodottoDaModificare.nome}</h2>
<div style="margin: 20px">
<form method="POST" action="update" id="datiProdotto">
<input type="hidden" name="id" value="${prodottoDaModificare.id}"/>
<div>
<label for="nome">Nome</label>
<input type="text" name="nome" value="${prodottoDaModificare.nome}" id="nome">
</div>
<div>
<label for="descrizione">Descrizione</label>
<input type="text" name="descrizione" value="${prodottoDaModificare.descrizione}" id="descrizione">
</div>
<div>
<label for="prezzo">Prezzo</label>
<input type="number" name="prezzo" value="${prodottoDaModificare.prezzo}" id="prezzo">
</div>
<div>
<input type="submit" name="invia" value="Salva modifiche"/S>
</div>
</form>
</div>
<#else>
<h2>Nuovo prodotto</h2>
<div style="margin: 20px">
<form method="POST" action="add" id="datiProdotto">
<div>
<label for="nome">Nome</label>
<input type="text" name="nome" value="" id="nome">
</div>
<div>
<label for="descrizione">Descrizione</label>
<input type="text" name="descrizione" value="" id="descrizione">
</div>
<div>
<label for="prezzo">Prezzo</label>
<input type="number" name="prezzo" value="" id="prezzo">
</div>
<div>
<input type="submit" name="invia" value="Aggiungi"/>
</div>
</form>
</div>
</#if>
<hr>
<h2>Lista prodotti</h2>
<div>
<table class="table">
<thead>
<tr>
<th>Nome</th>
<th>Descrizione</th>
<th>Prezzo</th>
<th>Azioni</th>
</tr>
</thead>
<tbody>
<#list listaProdotti as prodotto>
<tr>
<td>${prodotto.nome}</td>
<td>${prodotto.descrizione}</td>
<td>${prodotto.prezzo}</td>
<td>
<a href="delete?id=${prodotto.id}">Elimina</a>
<a href="lista?id=${prodotto.id}">Modifica</a>
</td>
</tr>
</#list>
</tbody>
</table>
</div>
</body>
</html>
当我尝试将值更新到表中时,我有以下错误:
freemarker模板错误(调试模式;在生产中使用rethrow!):以下评估为null或丢失:==&gt; prodottodamodificare.nome [在模板“ prodotti.ftl”第15行,第47列] ----提示:这是最后一个点后的造成此错误的步骤,而不是之前的错误。 ----提示:如果已知失败的表达方式是合法地指的是有时是无效或缺失的东西,请指定默认值,例如myoptionalvar!mydefault!mydefault,或使用&lt;#if myoptionalvar ?? ;失踪时。 (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~"含义与嵌套相关的): - 失败at:$ {prodottodamodificare.nome} [在模板“ prodotti.ftl”中,第15行,第45列] -------------------------------- java stack trace(适用于程序员):------------------------------------------------------------------------------------------------------------------------------------------------- .InvalidReferenceException:[...异常消息已在上面打印;在freemarker.core.evalutil.coercemodeltostostringormarkup(evalutil.java:401)上,freemarker.core.core.evalutil.coercececemodertostostrostringormarkup(evalutil.java:370) 。 DollarVariable.accept(DollarVariable.java:63) at freemarker.core.Environment.visit(Environment.java:347) at freemarker.core.Environment.visit(Environment.java:353) at freemarker.core.Environment.visit(Environment 。 processTemplate(FreeMarkerView.java:391) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:304) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView. Java:255)在org.springframework.web.servlet.view.abstracttemplateview.rendermerged.outputputmodel(AbstractTemplateView.java:179)org.springframework.serwork.web.servlet.web.servlet.view.view.view.firew.abstractView.gava.render(affact.render) .web.servlet.DispatcherServlet.render(DispatcherServlet.java:1401) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java :1084)在org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:963)on org.springframewramework.web.serv.serv.servlet.frameworkservlet.frameworkservlet.frameworkservlet.processRocessRocessRocessRocessRocessRocessRocessRocessrequest(FrameWorkservServServlet.java:java:1006) FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet .http.httpservlet.service(httpservlet.java:764)at org.apache.catalina.core.core.applicationfilterchain.internalsdofilter(applicationfilterterchain.java:227) ) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core. ApplicationFilterChain.Dofilter(ApplicationFilterChain.Java:162)org.springframework.web.filter.requestcontextfilter.dofilterinternal(requestContextfilter.java:100) 7)在org .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter 。 core.applicationfilterchain.dofilter(applicationfilterchain.java:162)org.springframework.web.filter.filter.character.daracterencodingfilter.dofilter.dofilterinternal(artemencodingfilter.java:201) AVA:117) atorg.apache.catalina.core.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:189)on org.apache.catalina.core.core.applicationfiltertelterfilterter.dofilter.dofilter(applicationFilterChain.java.java:162) (standardWrappervalve.java:197)atorg.apache.catalina.core.standardcontextvalve.invoke(standardcontcontextvalve.java:97)at org.apache.catalina.authenticator.authenticator.authenticator.authenticatoricator.authenticatorbase.invase.invoke(AuthentIcatiCatorbase.java:55.41java:541) catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787) at org.apache.tomcat.util.net.socketprocessorbase.run(socketProcessorbase.java:49)at org.apache.tomcat.tomcat.tomcat.threads.threads.threadpoolexecutor.runworker.runworker threads.threadpoolexecutor $ worker.run(threadpoolexecutor.java:659)at org.apache.tomcat.tomcat.util.threads.taskthread $ wrappingrunnable.run(taskthread.java:61)at Java.base/java.base/java.base/java.lang.thread.run( thread.java:833)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的问题是,当您进行
mm.Addattribute(“ ProdottoDamodificare”,p)
,p
不是prodotto
对象,而是选项
。当然,选项
没有nome
属性。使用mm.addattribute(“ prodottodamodificare”,p.orelse(null))
(如果对象必须存在,则orelsethrow
)。Your problem is that when you do
mm.addAttribute("prodottoDaModificare",p)
,p
is not aProdotto
object, but anOption
. And of course,Option
has nonome
property. Usemm.addAttribute("prodottoDaModificare",p.orElse(null))
(or if the object must be there, thenorElseThrow
).