Saltar al contenido

Ignore los campos del objeto Java dinámicamente mientras envía como JSON desde Spring MVC

Queremos brindarte la mejor solución que encontramos on line. Queremos que te sea de utilidad y si puedes comentarnos cualquier detalle que nos pueda ayudar a crecer hazlo con libertad.

Solución:

Añade el @JsonIgnoreProperties("fieldname") anotación a su POJO.

O puedes usar @JsonIgnore antes del nombre del campo que desea ignorar al deserializar JSON. Ejemplo:

@JsonIgnore
@JsonProperty(value = "user_password")
public String getUserPassword() 
    return userPassword;

Ejemplo de GitHub

Sé que llegué un poco tarde a la fiesta, pero también me encontré con esto hace unos meses. Todas las soluciones disponibles no me atraían mucho (¿mezclas? ¡uf!), así que terminé creando una nueva biblioteca para hacer este proceso más limpio. Está disponible aquí si alguien quiere probarlo: https://github.com/monitorjbl/spring-json-view.

El uso básico es bastante simple, usas el JsonView objeto en los métodos de su controlador así:

import com.monitorjbl.json.JsonView;
import static com.monitorjbl.json.Match.match;

@RequestMapping(method = RequestMethod.GET, value = "/myObject")
@ResponseBody
public void getMyObjects() 
    //get a list of the objects
    List list = myObjectService.list();

    //exclude expensive field
    JsonView.with(list).onClass(MyObject.class, match().exclude("contains"));

También puedes usarlo fuera de Spring:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import static com.monitorjbl.json.Match.match;

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);

mapper.writeValueAsString(JsonView.with(list)
      .onClass(MyObject.class, match()
        .exclude("contains"))
      .onClass(MySmallObject.class, match()
        .exclude("id"));

¿Puedo hacerlo dinámicamente?

Crear clase de vista:

public class View 
    static class Public  
    static class ExtendedPublic extends Public  
    static class Internal extends ExtendedPublic  

Anota tu modelo

@Document
public class User 

    @Id
    @JsonView(View.Public.class)
    private String id;

    @JsonView(View.Internal.class)
    private String email;

    @JsonView(View.Public.class)
    private String name;

    @JsonView(View.Public.class)
    private Instant createdAt = Instant.now();
    // getters/setters

Especifique la clase de vista en su controlador

@RequestMapping("/user/email")
public class UserController 

    private final UserRepository userRepository;

    @Autowired
    UserController(UserRepository userRepository) 
        this.userRepository = userRepository;
    

    @RequestMapping(method = RequestMethod.GET)
    @JsonView(View.Internal.class)
    public @ResponseBody Optional get(@PathVariable String email) 
        return userRepository.findByEmail(email);
    


Ejemplo de datos:

"id":"5aa2496df863482dc4da2067","name":"test","createdAt":"2018-03-10T09:35:31.050353800Z"

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *