Pregunta 1: Cuando Spring Boot usa JPA, hay un problema al acceder a la tabla de la base de datos en el Controlador y mostrarla en el navegador como (ResponseBody)
HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) )
----- Clase de entidad Usuario (correspondiente a tb_user en la base de datos)
//使用JPA
@Entity //是一个跟数据库对应的类
@Table(name="tb_user") //指定生成的表名
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //主键id自增长
private Integer id;
@Column(name = "email")
private String email;
@Column(name = "last_name", length = 50) //驼峰命名法, 并约定最长长度为50
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//只需要继承JpaRepository类, 便可使用数据库的CRUD,分页以及排序操做
//<User,Integer> 表示的是操作的实体类, 以及主键类型
public interface UserRepository extends JpaRepository<User, Integer> {
}
archivo de configuración application.yml
spring:
datasource:
username: root
password: *****
url: **************
driver-class-name: com.mysql.jdbc.Driver
# 更新或者创建表结构
jpa:
hibernate:
ddl-auto: update
show-sql: true
--UserController class, hay un método para encontrar User por id y devolverlo al navegador para mostrarlo en Json
@RestController
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") int id)
{
User user = userRepository.getOne(id);
return user;
}
}
Entonces ... tan pronto como lo visite, aparecerá el navegador
Intellij idea 中
大概 就是: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: no se encontró ningún serializador para la clase org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer y no se descubrieron propiedades para crear BeanSerializer (para evitar excepciones, deshabilite SerializationFeature.FAIL_BEON_EM) cadena de referencia: com.gdufe.entity.User _ $$ _ jvst21_0 ["handler"])
Luego busqué en Google un poco: descubrí que el problema parecía deberse a que la entidad estaba cargada de pereza y serialización antes de que estuviera completamente cargada.
La solución es: agregar un comentario en la clase de usuario
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler"})
如下图
Retrasar la carga configurando el objeto proxy de hibernación. Anotando que la clase tiene una propiedad privada de carga retrasada para evitarla
problema resuelto