J'ai une classe de modèle comme celle-ci, pour l'hibernation
@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;
}
}
Dans le contrôleur Spring MVC, en utilisant DAO, je suis capable d'obtenir l'objet. et retour en tant qu'objet 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 vue de la pièce se fait à l'aide d'AngularJS, elle obtiendra donc JSON comme ceci
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Si je ne veux pas définir un mot de passe chiffré, je définirai également ce champ comme nul.
Mais je ne veux pas comme ça, je ne veux pas envoyer tous les champs côté client. Si je ne veux pas de mot de passe, mis à jour par, créé par les champs à envoyer, mon résultat JSON devrait être comme
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]"
}
La liste des champs que je ne veux pas envoyer au client provenant d'une autre table de base de données. Cela changera donc en fonction de l'utilisateur connecté. Comment puis-je faire cela?
J'espère que vous avez ma question.
la source
Réponses:
Ajoutez l'
@JsonIgnoreProperties("fieldname")
annotation à votre POJO.Ou vous pouvez utiliser
@JsonIgnore
avant le nom du champ que vous souhaitez ignorer lors de la désérialisation de JSON. Exemple:Exemple GitHub
la source
@JsonIgnore
n'estcom.fasterxml.jackson.annotation.JsonIgnore
pasorg.codehaus.jackson.annotate.JsonIgnore
.Je sais que je suis un peu en retard à la fête, mais je suis tombé sur cela aussi il y a quelques mois. Toutes les solutions disponibles ne m'attiraient pas beaucoup (mixins? Ugh!), Alors j'ai fini par créer une nouvelle bibliothèque pour rendre ce processus plus propre. Il est disponible ici si quelqu'un souhaite l'essayer: https://github.com/monitorjbl/spring-json-view .
L'utilisation de base est assez simple, vous utilisez l'
JsonView
objet dans vos méthodes de contrôleur comme ceci:Vous pouvez également l'utiliser en dehors du printemps:
la source
Créer une classe de vue:
Annoter votre modèle
Spécifiez la classe de vue dans votre contrôleur
Exemple de données:
la source
Nous pouvons le faire en définissant access sur
JsonProperty.Access.WRITE_ONLY
lors de la déclaration de la propriété.la source
Ajoutez
@JsonInclude(JsonInclude.Include.NON_NULL)
(force Jackson à sérialiser les valeurs nulles) à la classe ainsi qu'au@JsonIgnore
champ de mot de passe.Vous pourriez bien sûr définir
@JsonIgnore
sur createdBy et updatedBy également si vous voulez toujours ignorer alors et pas seulement dans ce cas spécifique.METTRE À JOUR
Dans le cas où vous ne souhaitez pas ajouter l'annotation au POJO lui-même, une excellente option est les annotations Mixin de Jackson. Consultez la documentation
la source
Oui, vous pouvez spécifier quels champs sont sérialisés en tant que réponse JSON et lesquels ignorer. C'est ce que vous devez faire pour implémenter les propriétés Ignorer dynamiquement.
1) Tout d'abord, vous devez ajouter @JsonFilter de com.fasterxml.jackson.annotation.JsonFilter sur votre classe d'entité en tant que.
2) Ensuite, dans votre contrôleur, vous devez ajouter créer l'objet MappingJacksonValue et définir des filtres dessus et à la fin, vous devez retourner cet objet.
Voici ce que vous obtiendrez en réponse:
au lieu de cela:
Ici, vous pouvez voir qu'il ignore les autres propriétés (field3 dans ce cas) en réponse à l'exception de la propriété field1 et field2.
J'espère que cela t'aides.
la source
Si j'étais vous et que je voulais le faire, je n'utiliserais pas mon entité User dans la couche Controller. Vous pouvez utiliser Apache BeanUtils (méthode copyProperties) pour copier les données de l'entité User vers UserDto.
la source
J'ai créé un JsonUtil qui peut être utilisé pour ignorer les champs lors de l'exécution tout en donnant une réponse.
Exemple d'utilisation: Le premier argument doit être n'importe quelle classe POJO (Student) et ignoreFields est des champs séparés par des virgules que vous voulez ignorer en réponse.
la source
J'ai résolu en utilisant uniquement
@JsonIgnore
comme @kryger l'a suggéré. Ainsi votre getter deviendra:Vous pouvez
@JsonIgnore
bien sûr définir sur le terrain, le setter ou le getter comme décrit ici .Et, si vous souhaitez protéger le mot de passe crypté uniquement du côté de la sérialisation (par exemple lorsque vous devez vous connecter à vos utilisateurs), ajoutez cette
@JsonProperty
annotation à votre champ :Plus d'infos ici .
la source
J'ai trouvé une solution pour moi avec Spring et Jackson
Spécifiez d'abord le nom du filtre dans l'entité
Ensuite, vous pouvez voir la classe de noms de filtres de constantes avec le FilterProvider par défaut utilisé dans la configuration de ressort
Configuration du ressort:
Enfin, je peux spécifier un filtre spécifique dans restConstoller quand j'ai besoin ...
la source
Placez
@JsonIgnore
sur le champ ou son getter, ou créez un dto personnaliséou comme mentionné ci-dessus en l'
ceekay
annotant avec@JsonProperty
où l'attribut d'accès est défini pour écrire uniquementla source
Ne créerait pas un
UserJsonResponse
classe et le peuplement des champs voulus ne serait-elle pas une solution plus propre?Renvoyer directement un JSON semble une excellente solution lorsque vous souhaitez rendre tout le modèle. Sinon, ça devient juste compliqué.
À l'avenir, par exemple, vous voudrez peut-être avoir un champ JSON qui ne correspond à aucun champ de modèle et vous aurez alors un plus gros problème.
la source
Ceci est un outil utilitaire propre pour la réponse ci-dessus :
la source
Dans votre classe d'entité, ajoutez une
@JsonInclude(JsonInclude.Include.NON_NULL)
annotation pour résoudre le problèmeça ressemblera à
la source