Estou utilizando o VRaptor em uma aplicação web baseada em Rest.
Meu problema aparece quando recebo o JSON de uma classe para gravar no banco… o mesmo não vem completo.
Digamos que eu possua a seguinte classe:
@Entity
@Table(schema = "sh_sistema")
@SequenceGenerator(name = "SEQUENCE_USUARIO", sequenceName = "sh_sistema.seq_usuario")
@ConstraintUnique(attributes = @ConstraintUniqueAttribute(name = "login", message = "Já existe um usuário com esse login."))
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@ToString(exclude = "grupos")
public class Usuario {
@Id
@GeneratedValue(generator = "SEQUENCE_USUARIO")
@NonNull
private Long id;
private boolean ativo = true;
@Email
@NotNull
private String email;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "grupo_usuario", schema = "sh_sistema")
private Set<Grupo> grupos;
@NotNull
private String login;
private String nome;
private String senha;
public boolean contains(String chave) {
if(getGrupos() != null) {
for (Grupo grupo : getGrupos()) {
if(grupo.contains(chave)) {
return true;
}
}
}
return false;
}
}
O JSON que é recebido pela aplicação em determinado momento não possui o Set de grupos. Apenas algumas informações como email, nome etc. Nesse caso tenho que buscar o objeto no banco caso o id seja diferente de null e completar os atributos faltantes:
@Component
public class UsuarioBusiness extends Business <Usuario, Long, UsuarioRepository> {
@Transactional
@Override
public Pair<Boolean, String> save(Usuario entity) {
//Carrega os atributos restantes.
if(entity.getId() != null) {
//senha -> Deve ser carregada pois a mesma não é enviada para a view.
copy(findOne(entity.getId()), entity).set("senha").set("grupos");
}
return super.save(entity);
}
}
Tive a idéia de adaptar o @Load default do VRaptor para resolver o problema de ficar carregando os atributos que não são enviados. Mas no momento que busco a classe no banco os parâmetros restantes que se encontram no request não são atualizados na instância cria por mim.
Como devo proceder nesse caso? Existe uma solução melhor?