Pessoal, estou usando EJB3+JSON e estou com um problema para listar valores. Tenho uma classe Usuario que tem referência para outra classe Usuario-Salario. O relacionamento entre as classes é de um para muitos, ou seja, cada usuário pode ter um ou mais usuarios-salário. Então na classe Usuario, tenho um set de usuarios-salário.
Na tela de usuários existe a necessidade da listagem de valores que estão contidos em UsuarioSalario, então imaginei retornar uma listagem de objetos de usuário com a referência da sua listagem de usuariosSalarios(usando uma namedQuery por exemplo). No entanto, esses valores não estão sendo retornados na view.
A lista de objetos de UsuarioSalario já está anotada como podem ver abaixo e mesmo assim a lista não é convertida pelo Json. Eu debugei as classes de conversão do Json e percebi que o problema poderia ser no tipo da listagem que estava sendo usada (Set ) , pois durante a conversão ele a identificava como IndirectSet o que não combina com os tipos que o Json converte (Collection, Array e Primitivo). O mesmo acontece se for usado List (Ele identifica como IndirectList). Tentei mudar o tipo da listagem para Array, mas descobri que o JPA não aceita esse tipo de mapeamento para objetos de entidades. Tentei usar ArrayList, mas tb ocorrem outros problemas.
Alguém já fez algo do tipo? Como contornou esse problema? Ou tem outra sugestão?
Action
public ActionForward listar(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
Collection usuarios = usuarioEJBBean.listarTodos();
JSONResponse jsonResponse = new JSONResponse();
jsonResponse.put("usuarios", usuarios);
jsonResponse.put("total", usuarios.size());
String callback = request.getParameter("callback");
request.setAttribute("json", jsonResponse.toJSON(callback, "BASICO, ADMINISTRATIVO", 3));
return mapping.findForward("json");
}
Bean
@Override
public Collection listarTodos() {
EntityManager em = emf.createEntityManager();
Query query = em.createNamedQuery("Usuario.findAll");
return query.getResultList();
}
Entidade Usuario
@Entity
@Table(name = "usuario")
@NamedQueries({
@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u")
?
})
@JSONObject
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@OneToMany(mappedBy = "usuario")
@JSONAttribute(profile = "ADMINISTRATIVO")
private Set<UsuarioSalario> usuariosSalario;
...
public Set<UsuarioSalario> getUsuariosSalario() {
return usuariosSalario;
}
public void setUsuariosSalario(Set<UsuarioSalario> usuariosSalario) {
this.usuariosSalario = usuariosSalario;
}
}
Classe UsuarioSalario
@JSONObject
public class UsuarioSalario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@JSONAttribute(profile = "BASICO")
private Integer id;
@ManyToOne
@JoinColumn(name = "usuario_id", referencedColumnName="id")
@JSONAttribute(profile = "BASICO")
private Usuario usuario;
?
}