Tengo una clase modelo como esta, para hibernar
@Entity
@Table(name = "user", catalog = "userdb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements java.io.Serializable {
private Integer userId;
private String userName;
private String emailId;
private String encryptedPwd;
private String createdBy;
private String updatedBy;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "UserId", unique = true, nullable = false)
public Integer getUserId() {
return this.userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "UserName", length = 100)
public String getUserName() {
return this.userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "EmailId", nullable = false, length = 45)
public String getEmailId() {
return this.emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
@Column(name = "EncryptedPwd", length = 100)
public String getEncryptedPwd() {
return this.encryptedPwd;
}
public void setEncryptedPwd(String encryptedPwd) {
this.encryptedPwd = encryptedPwd;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
@Column(name = "UpdatedBy", length = 100)
public String getUpdatedBy() {
return this.updatedBy;
}
public void setUpdatedBy(String updatedBy) {
this.updatedBy = updatedBy;
}
}
En el controlador Spring MVC, usando DAO, puedo obtener el objeto. y regresando como Objeto JSON.
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable Integer userId) throws Exception {
User user = userService.get(userId);
user.setCreatedBy(null);
user.setUpdatedBy(null);
return user;
}
}
La parte de vista se realiza usando AngularJS, por lo que obtendrá JSON como este
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Si no quiero establecer una contraseña cifrada, estableceré ese campo también como nulo.
Pero no quiero así, no quiero enviar todos los campos al lado del cliente. Si no quiero contraseña, campos actualizados por, creados por para enviar, mi resultado JSON debería ser
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]"
}
La lista de campos que no quiero enviar al cliente procede de otra tabla de base de datos. Entonces cambiará según el usuario que haya iniciado sesión. ¿Cómo puedo hacer eso?
Espero que tengas mi pregunta.
java
json
hibernate
spring-mvc
iCode
fuente
fuente
Respuestas:
Agregue la
@JsonIgnoreProperties("fieldname")
anotación a su POJO.O puede usar
@JsonIgnore
antes del nombre del campo que desea ignorar mientras deserializa JSON. Ejemplo:Ejemplo de GitHub
fuente
@JsonIgnore
es .com.fasterxml.jackson.annotation.JsonIgnore
org.codehaus.jackson.annotate.JsonIgnore
Sé que llego un poco tarde a la fiesta, pero en realidad me encontré con esto hace unos meses. Todas las soluciones disponibles no eran muy atractivas para mí (¿mixins? ¡Uf!), Así que terminé creando una nueva biblioteca para hacer este proceso más limpio. Está disponible aquí si alguien quisiera probarlo: https://github.com/monitorjbl/spring-json-view .
El uso básico es bastante simple, usa el
JsonView
objeto en los métodos de su controlador así:También puede usarlo fuera de Spring:
fuente
Crear clase de vista:
Anotar su modelo
Especifique la clase de vista en su controlador
Ejemplo de datos:
fuente
Podemos hacer esto configurando el acceso a
JsonProperty.Access.WRITE_ONLY
mientras declaramos la propiedad.fuente
Agregue
@JsonInclude(JsonInclude.Include.NON_NULL)
(obliga a Jackson a serializar valores nulos) a la clase y@JsonIgnore
al campo de contraseña.Por supuesto, también puede configurar
@JsonIgnore
createdBy y updatedBy si siempre desea ignorar entonces y no solo en este caso específico.ACTUALIZAR
En el caso de que no desee agregar la anotación al POJO en sí, una excelente opción son las Anotaciones Mixin de Jackson. Consulte la documentación
fuente
Sí, puede especificar qué campos se serializan como respuesta JSON y cuáles ignorar. Esto es lo que debe hacer para implementar propiedades Ignorar dinámicamente.
1) Primero, debe agregar @JsonFilter de com.fasterxml.jackson.annotation.JsonFilter en su clase de entidad como.
2) Luego, en su controlador, debe agregar crear el objeto MappingJacksonValue y establecer filtros y, al final, debe devolver este objeto.
Esto es lo que obtendrá en respuesta:
en lugar de esto:
Aquí puede ver que ignora otras propiedades (campo3 en este caso) en respuesta a excepción de la propiedad campo1 y campo2.
Espero que esto ayude.
fuente
Si yo fuera usted y quisiera hacerlo, no usaría mi entidad Usuario en la capa Controlador, sino que creo y uso UserDto (Objeto de transferencia de datos) para comunicarme con la capa (Servicio) comercial y el Controlador. Puede utilizar Apache BeanUtils (método copyProperties) para copiar datos de la entidad Usuario a UserDto.
fuente
He creado un JsonUtil que se puede usar para ignorar campos en tiempo de ejecución mientras se da una respuesta.
Ejemplo de uso: el primer argumento debe ser cualquier clase POJO (Estudiante) e ignoreFields son campos separados por comas que desea ignorar en respuesta.
fuente
Lo resolví usando solo
@JsonIgnore
como lo sugirió @kryger. Entonces tu getter se convertirá en:Puede establecer,
@JsonIgnore
por supuesto, en campo, setter o getter como se describe aquí .Y, si desea proteger la contraseña cifrada solo en el lado de la serialización (por ejemplo, cuando necesita iniciar sesión con sus usuarios), agregue esta
@JsonProperty
anotación a su campo :Más info aquí .
fuente
Encontré una solución para mí con Spring y Jackson
Primero especifique el nombre del filtro en la entidad
Luego puede ver la clase de nombres de filtros de constantes con el FilterProvider predeterminado utilizado en la configuración de primavera
Configuración de primavera:
Finalmente, puedo especificar un filtro específico en restConstoller cuando lo necesite ...
fuente
Colóquelo
@JsonIgnore
en el campo o su captador, o cree un dto personalizadoo como se mencionó anteriormente
ceekay
anotándolo con@JsonProperty
donde el atributo de acceso está configurado para escribir solofuente
No crearía un
UserJsonResponse
sería una solución más limpia clase y completar los campos deseados?Devolver directamente un JSON parece una gran solución cuando desea devolver todo el modelo. De lo contrario, se vuelve complicado.
En el futuro, por ejemplo, es posible que desee tener un campo JSON que no coincida con ningún campo de modelo y luego se encontrará en un problema mayor.
fuente
Esta es una herramienta de utilidad limpia para la respuesta anterior :
fuente
En su clase de entidad, agregue una
@JsonInclude(JsonInclude.Include.NON_NULL)
anotación para resolver el problemase verá como
fuente