我有两个Java类:Usuario和entrada。
乌苏亚里奥:
@Entity
@Table(name="usuario")
@NamedQuery(name="Usuario.findAll", query="SELECT u FROM Usuario u")
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int idusuario;
private String apellido1;
private String apellido2;
private String email;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="fecha_alta")
private Date fechaAlta;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="fecha_baja")
private Date fechaBaja;
@Column(name="is_admin")
private boolean isAdmin;
private String nombre;
private String password;
//bi-directional many-to-one association to CompraEntrada
@OneToMany(mappedBy="usuarioBean")
@JsonIgnore
private List<CompraEntrada> compraEntradas;
//bi-directional many-to-one association to Entrada
@OneToMany(mappedBy="usuarioBean")
private List<Entrada> entradas;
//bi-directional many-to-one association to Evento
@OneToMany(mappedBy="usuario")
@JsonIgnore
private List<Evento> eventos;
//bi-directional many-to-one association to Mensaje
@OneToMany(mappedBy="emisor")
@JsonIgnore
private List<Mensaje> mensajesEmitidos;
//bi-directional many-to-one association to Mensaje
@OneToMany(mappedBy="receptor")
@JsonIgnore
private List<Mensaje> mensajesRecibidos;
Entrada:
@Entity
@Table(name="entrada")
@NamedQuery(name="Entrada.findAll", query="SELECT e FROM Entrada e")
public class Entrada implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int identrada;
//bi-directional many-to-one association to Evento
@ManyToOne
@JoinColumn(name="evento")
private Evento eventoBean;
//bi-directional many-to-one association to Usuario
@ManyToOne
@JoinColumn(name="usuario")
@JsonIgnore
private Usuario usuarioBean;
我晚上还有课:
@Entity
@Table(name="evento")
@NamedQuery(name="Evento.findAll", query="SELECT e FROM Evento e")
public class Evento implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int idevento;
private String categoria;
private String descripcion;
@Column(name="entradas_disponibles")
private int entradasDisponibles;
@Column(name="entradas_venta")
private int entradasVenta;
private int estado;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="fecha_hora")
private Date fechaHora;
private String imagen;
private String localizacion;
@Column(name="precio_entrada")
private double precioEntrada;
private String titulo;
//bi-directional many-to-one association to CompraEntrada
@OneToMany(mappedBy="eventoBean")
private List<CompraEntrada> compraEntradas;
//bi-directional many-to-one association to Entrada
@OneToMany(mappedBy="eventoBean")
private List<Entrada> entradas;
//bi-directional many-to-one association to Usuario
@ManyToOne
@JoinColumn(name="creador")
private Usuario usuario;
我正在使用Spring数据,但我有一个递归序列化问题。当我“打印”一个Usuario类型的对象时,它应该序列化Usuario的所有信息。这里的要点是,Entrada(Usuario中的List)有一个Usuario类型的属性。
我不想序列化Entrada的Usuario。我只是想序列化Usuario列表中的每一个项目。
我尝试在Entrada中的Usuario类型属性中添加@jsonignore,但仍然存在同样的问题。
日志显示:
2017-12-04 18:57:46.980[0;39m [31mERROR[0;39m [35m3389[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: es.softcorp.domains.Entrada["eventoBean"]->es.softcorp.domains.Evento["entradas"]->org.hibernate.collection.internal.PersistentBag[0]->es.softcorp.domains.Entrada["eventoBean"]->es.softcorp.domains.Evento["entradas"]->org.hibernate.collection.internal.PersistentBag[0]->es.softcorp.domains.Entrada["eventoBean"]->es.softcorp.domains.Evento["entradas"]-
等等
我已经解决了这个问题,从我所记得的@jsonignore
要工作,您必须对该类禁用自动字段检测,或者如果您希望对所有类禁用自动字段检测。
有两种方法可以解决递归问题。
@jsonignore
,@jsonview
导致递归/循环的字段。对于一个示例项目,我禁用了所有此类类的自动字段检测,并在我想序列化的类中使用@jsonproperty
和@jsonignore
。如果自动检测被禁用,您必须手动标记字段。
/**
* Disable auto field detection for JSON message converter.
* @return
*/
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setVisibility(
objectMapper
.getVisibilityChecker()
.with(Visibility.NONE)
);
jsonConverter.setObjectMapper(objectMapper);
return jsonConverter;
}
还有@jsonview
注释,其工作方式与@jsonignore
类似,可以用来选择哪些字段将被序列化,下面是进一步阅读https://spring.io/blog/2014/12/02/lates-jackson-integration-informings-in-spring的链接
解决问题的正确方法是告诉ObjectMapper递归/双向关系,如本页http://www.baeldung.com/jackson-biodirectories-relations-and-infinition-recursion所述
总之,在子级(非拥有方)使用@JSONManagedReference
,在父级(关系的拥有方)使用@JSONBackReference
。
基于文档,@EnableSideCar注释充当希望在Eureka中注册的非JVM应用程序的代理。相应地,要设置的配置为: 一旦“sidecar”启动并运行,我们应该能够通过service registry调用一个非JVMendpoint,只需使用“sidecar”应用程序在Eureka中注册的名称。例如,如果我们的“sidecar”应用程序在Eureka中注册为“php-sidecar”,以代理带
我是Spring Security的新手。我们在我的一个示例示例中使用Spring Security 5.4.5和Spring Boot。 我在下面的配置类中尝试在RESTAPI的/user和/adminendpoint中应用Spring Security身份验证/授权。 根据上述Spring配置 /userUSER和ADMIN角色都可以访问, /adminADMIN角色也可以访问。 当我试图在浏
我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它
当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。
我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括: