2017-09-25 5 views
0

J'ai ce scénario bizarre - j'ai cette classe PlatformUser qui implémente PrincipalgetName() qui retourne son email. Ceci est nécessaire pour l'autorisation. Je voudrais pouvoir sérialiser et désérialiser le PlatformUser basé sur les propriétés publiques name et email. Comment dois-je annoter ma classe pour que cela fonctionne? Comme une solution de contournement, j'ai dû changer la propriété name à fullName mais cela défie le but de ma question. Merci!biens publics éclipsée par getter public dans sérialisation JSON

import org.apache.commons.lang3.StringUtils; 
import org.springframework.security.core.GrantedAuthority; 
import org.springframework.security.core.authority.SimpleGrantedAuthority; 

import javax.persistence.*; 
import javax.security.auth.Subject; 
import java.security.Principal; 
import java.util.*; 

@Entity 
public class PlatformUser implements Principal { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public int id; 
    public String name; 
    public String email; 
    public String role = getUserRole().getRole().toString().toLowerCase(); 

    @Transient 
    private List<GrantedAuthority> authorities; 

    public PlatformUser(){} 

    public PlatformUser(String email, List<GrantedAuthority> authorities) { 
     this.email = email; 
     this.authorities = authorities; 
    } 

    @Override 
    public String getName() { 
     return email; 
    } 

    @Override 
    public boolean implies(Subject subject) { 
     return false; 
    } 

    public static PlatformUser create(String email, List<GrantedAuthority> authorities) { 
     if (StringUtils.isBlank(email)) throw new IllegalArgumentException("Email is blank: " + email); 
     return new PlatformUser(email, authorities); 
    } 

    public Set<GrantedAuthority> getAuthorities() { 
     UserRole role = this.getUserRole(); 
     Set<GrantedAuthority> authorities = new HashSet<>(); 
     authorities.add(new SimpleGrantedAuthority(role.getRole().authority())); 
     return authorities; 
    } 

    public void setAuthorities(List<GrantedAuthority> authorities) { 
     this.authorities = authorities; 
    } 

    public UserRole getUserRole() { 
     return new UserRole(id, Role.ADMIN); 

    } 

} 

Répondre

0

Je trouve la réponse ici: http://www.baeldung.com/jackson-field-serializable-deserializable-or-not

J'ai ajouté cette @Bean dans ma configuration à ignorer les getters/setters et utiliser uniquement les propriétés:

@Bean 
public ObjectMapper objectMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); 
    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

    return mapper; 
}