使用 Spring + Thymeleaf 时出现 java.lang.***Error
Posted
技术标签:
【中文标题】使用 Spring + Thymeleaf 时出现 java.lang.***Error【英文标题】:Getting java.lang.***Error while using Spring + Thymeleaf 【发布时间】:2020-06-17 03:25:33 【问题描述】:我正在使用 Java Spring Boot + Thymeleaf 开发一个分解系统。我收到此错误:
>Whitelabel Error Page
>This application has no explicit mapping for /error, so you are seeing this as a fallback.
>Wed Mar 04 10:58:26 ART 2020
>There was an unexpected error (type=Internal Server Error, status=500).
>No message available
>java.lang.***Error
我使用两个控制器来处理分为 3 个表的账单的填写:Encabezado(header)Items 和 Pie (foot) 类Encabezado:
@EqualsAndHashCode
@Entity
@Table(name="facturas_encabezado")
public class Encabezado implements Serializable
private static final long serialVersionUID = -3479505724865821556L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
private Timestamp fecha;
@NotNull
@Size(min = 1,max = 11)
private String numero;
@Nullable
private String letra;
@NotNull
@OneToOne
private Cliente cliente;
@OneToMany(mappedBy = "encabezado")
private List<Item> items;
@NotNull
private Boolean anulado=false;
类项目
@Entity
@Table(name="facturas_items")
public class Item implements Serializable
private static final long serialVersionUID = -3560761383569266746L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "productos_id")
private Producto producto;
@ManyToOne
@JoinColumn(name = "facturas_encabezado_id")
private Encabezado encabezado;
private BigDecimal cantidad;
private BigDecimal precioUnitario;
private BigDecimal subTotal;
标头控制器
@Controller
@RequestMapping("/factura")
public class EncabezadoControl
@Autowired
private ClienteRepositorio clienterepository;
@Autowired
private ProductoRepositorio productorepository;
@Autowired
private EncabezadoRepositorio encabezadorepository;
@GetMapping("/creacion_factura")
public String creacionFactura(Encabezado encabezado,Errors errors,Model model )
List<Cliente> clientes;
clientes=clienterepository.findByVisibilidad();
model.addAttribute("titulo", "Listado de Clientes");
model.addAttribute("data", clientes);
model.addAttribute("encabezado",new Encabezado());
return "facturas/creacion_factura";
@PostMapping(value = "/creacion_factura")
public String guardarFactura(Encabezado encabezado,Errors errors,Model model)
Timestamp timestamp = new Timestamp(System.currentTimeMillis()); //Instanciamos fecha actual para el encabezado de factura.
encabezado.setFecha(timestamp);
model.addAttribute("facturaInfo",encabezado);
System.out.println(encabezado);
if(encabezado.getId()==null)
encabezadorepository.save(encabezado);
Long id=encabezado.getId();
return "redirect:/factura/establecer_productos/"+id;
项目控制器
@Controller
@RequestMapping("/factura")
public class ItemControl
@Autowired
private ItemRepositorio itemrepository;
@Autowired
private ProductoRepositorio productorepository;
@Autowired
private EncabezadoRepositorio encabezadorepository;
@GetMapping(value = "/establecer_productos/id")
public String indicarProductos(Model model, @PathVariable Long id)
List<Producto> listaproductos=null;
listaproductos=productorepository.findByEstado();
model.addAttribute("titulo", "Selección de Productos");
model.addAttribute("productos",listaproductos);
model.addAttribute("item", new Item());
return "facturas/seleccion_productos";
@PostMapping(value = "/establecer_productos/ided")
public String procesarProductos(@PathVariable Long ided, Item item,Model model)
if(item.getId()==null)
BigDecimal cantidad = item.getCantidad();
BigDecimal precio = item.getPrecioUnitario();
item.setSubTotal(cantidad.multiply(precio));
item.setEncabezado(encabezadorepository.getOne(ided));
itemrepository.save(item);
System.out.println("ITEM\n\n\n"+item+"\n\n\n");
return "redirect:/factura/establecer_productos/"+ided;
第一步视图:头创建
<div class="container">
<form method="post" th:action="@/factura/creacion_factura" th:object="$encabezado">
<br/>
<h2>Introduzca los datos de la Factura</h2>
<hr/>
<div class="row">
<div class="col-md-3">
<h3>Cliente</h3>
</div>
<div class="col-md-6">
<select name="cliente" class="form-control form-control-lg" th:field="*cliente">
<option th:each="cliente : $data" th:value="$cliente.id" th:text="$cliente.nombre"></option>
</select>
</div>
<div class="col-md-3"></div>
</div>
<div class="row" th:class="$#fields.hasErrors('numero') ? 'form-group row has-danger' : (*numero == null ? 'form-group row' : 'form-group row has-success')">
<div class="col-md-3">
<h3>Numero Factura</h3>
</div>
<div class="col-md-6">
<div class="input-group">
<input th:field="*numero" type="text" th:class="$#fields.hasErrors('numero') ? 'form-control form-control-danger' : (*numero == null ? 'form-control' : 'form-control form-control-success')" placeholder="Ingrese el numero de factura" required="required"/>
</div>
<div th:if="$#fields.hasErrors('numero')" class="form-control-feedback">El número debe tener entre 1 y 11 caracteres</div>
</div>
<div class="col-md-3"></div>
</div>
<div class="row" th:class="$#fields.hasErrors('letra') ? 'form-group row has-danger' : (*letra == null ? 'form-group row' : 'form-group row has-success')">
<div class="col-md-3">
<h3>Categoria Factura</h3>
</div>
<div class="col-md-6">
<select class="form-control form-control-lg" th:field="*letra" >
<option th:value="'A'"th:text="A"></option>
<option th:value="'B'"th:text="B"></option>
<option th:value="'C'"th:text="C"></option>
</select>
</div>
<div class="col-md-3"></div>
</div>
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-6">
<button type="submit" class="btn btn-primary btn-md btn-block">Siguiente Paso</button>
</div>
</div>
</form>
</div>
第二步:添加项目视图
<div class="container">
<form method="post" th:action="@/factura/establecer_productos/id(id=$id)" th:object="$item">
<br/>
<h2>Seleccione los Productos de la Factura</h2>
<hr/>
<div class="row">
<div class="col-md-3">
<h3>Productos</h3>
</div>
<div class="col-md-6">
<select class="form-control form-control-lg" name="producto" th:field="*producto">
<option th:each="producto : $productos" th:value="$producto.id" th:text="$producto.nombre"></option>
z</select>
</div>
<div class="col-md-3"></div>
</div>
<div class="row">
<div class="col-md-3">
<h4>Cantidad</h4>
</div>
<div class="col-md-6">
<div class="input-group">
<input class="form-control text-center" th:field="*cantidad" type="text" th:class="$#fields.hasErrors('cantidad') ? 'form-control form-control-danger' : (*cantidad == null ? 'form-control' : 'form-control form-control-success')" placeholder="introduzca cantidad a comprar" required="required"/>
</div>
<div th:if="$#fields.hasErrors('cantidad')" class="form-control-feedback">La cantidad es obligatoria</div>
</div>
<div class="col-md-3"></div>
</div>
<div class="row">
<div class="col-md-3">
<h4>Precio Unitario</h4>
</div>
<div class="col-md-6">
<div class="input-group">
<input class="form-control text-center" th:field="*precioUnitario" type="text" th:class="$#fields.hasErrors('precioUnitario') ? 'form-control form-control-danger' : (*precioUnitario == null ? 'form-control' : 'form-control form-control-success')" placeholder="introduzca precio unitario" required="required"/>
</div>
<div th:if="$#fields.hasErrors('precioUnitario')" class="form-control-feedback">El precio es obligatoria</div>
</div>
<div class="col-md-3"></div>
</div>
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-6">
<button type="submit" class="btn btn-primary btn-md btn block">Siguiente</button>
</div>
</div>
</form>
</div>
编译执行顺利。帐单标题已正确保存在数据库中,但是当我们进行第二步时出现问题:该项目已保存,导致整个执行崩溃。有什么解决办法吗?
【问题讨论】:
请添加 StackTrace 这篇文章太长了,无法添加。这里是 StackTrace 的链接:pastebin.com/Pyf5HkDk 问题出在 Encabezado 中的 toString 方法。你用龙目岛吗? 是的,我使用 Lombok。 这能回答你的问题吗? Circular Dependency bidirectional @OneToMany JPA relationship 【参考方案1】:不要将@Data, @ToString, @EqualsAndHashCode
与 JPA 一起使用,它们会导致 ***Errors 和其他问题。
请阅读: https://mdeinum.github.io/2019-02-13-Lombok-Data-Ojects-Arent-Entities/
这里应该如何实现这些方法: https://vladmihalcea.com/the-best-way-to-implement-equals-hashcode-and-tostring-with-jpa-and-hibernate/
【讨论】:
以上是关于使用 Spring + Thymeleaf 时出现 java.lang.***Error的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 Thymeleaf 和 Spring Security 项目中插入图像时出现 404 错误
springboot引入thymeleaf时出现Cannot resolve MVC View ‘test‘
springboot引入thymeleaf时出现Cannot resolve MVC View ‘test‘
使用 Spring Security 时出现意外的 403 错误