Eu tenho uma classe 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;
}
}
No controlador Spring MVC, usando DAO, sou capaz de obter o objeto. e retornando 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;
}
}
A parte da visualização é feita usando AngularJS, então ele obterá JSON assim
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Se eu não quiser definir a senha criptografada, irei definir esse campo também como nulo.
Mas não quero assim, não quero mandar todos os campos para o lado do cliente. Se eu não quiser senha, atualizada por, criada por campos para enviar, Meu resultado JSON deve ser como
{
"userId" :2,
"userName" : "john",
"emailId" : "[email protected]"
}
A lista de campos que não desejo enviar ao cliente proveniente de outra tabela do banco de dados. Portanto, ele mudará com base no usuário que está conectado. Como posso fazer isso?
Espero que você tenha entendido minha pergunta.
java
json
hibernate
spring-mvc
iCode
fonte
fonte
Respostas:
Adicione a
@JsonIgnoreProperties("fieldname")
anotação ao seu POJO.Ou você pode usar
@JsonIgnore
antes do nome do campo que deseja ignorar ao desserializar JSON. Exemplo:Exemplo GitHub
fonte
@JsonIgnore
é .com.fasterxml.jackson.annotation.JsonIgnore
org.codehaus.jackson.annotate.JsonIgnore
Sei que estou um pouco atrasado para a festa, mas na verdade também me deparei com isso alguns meses atrás. Todas as soluções disponíveis não eram muito atraentes para mim (mixins? Ugh!), Então acabei criando uma nova biblioteca para tornar esse processo mais limpo. Está disponível aqui se alguém quiser experimentá-lo: https://github.com/monitorjbl/spring-json-view .
O uso básico é muito simples, você usa o
JsonView
objeto em seus métodos de controlador assim:Você também pode usá-lo fora do Spring:
fonte
Criar classe de visualização:
Faça anotações em seu modelo
Especifique a classe de visualização em seu controlador
Exemplo de dados:
fonte
Podemos fazer isso configurando o acesso para
JsonProperty.Access.WRITE_ONLY
ao declarar a propriedade.fonte
Adicione
@JsonInclude(JsonInclude.Include.NON_NULL)
(força Jackson a serializar valores nulos) para a classe, bem como@JsonIgnore
para o campo de senha.É claro que você também pode definir
@JsonIgnore
createdBy e updatedBy se quiser sempre ignorá-los e não apenas neste caso específico.ATUALIZAR
Caso você não queira adicionar a anotação ao próprio POJO, uma ótima opção são as Anotações do Mixin de Jackson. Confira a documentação
fonte
Sim, você pode especificar quais campos são serializados como resposta JSON e quais ignorar. Isso é o que você precisa fazer para implementar Propriedades de ignorar dinamicamente.
1) Primeiro, você precisa adicionar @JsonFilter de com.fasterxml.jackson.annotation.JsonFilter em sua classe de entidade como.
2) Em seguida, em seu controlador, você deve adicionar, criar o objeto MappingJacksonValue e definir filtros nele e no final, você deve retornar este objeto.
Esta é a resposta que você receberá:
em vez disso:
Aqui você pode ver que ele ignora outras propriedades (campo3 neste caso) em resposta, exceto para a propriedade campo1 e campo2.
Espero que isto ajude.
fonte
Se eu fosse você e quisesse fazer isso, não usaria minha entidade de usuário na camada de controlador. Em vez disso, crio e uso UserDto (objeto de transferência de dados) para me comunicar com a camada de negócios (serviço) e o controlador. Você pode usar o Apache BeanUtils (método copyProperties) para copiar dados da entidade User para UserDto.
fonte
Eu criei um JsonUtil que pode ser usado para ignorar campos em tempo de execução ao fornecer uma resposta.
Exemplo de uso: O primeiro argumento deve ser qualquer classe POJO (Student) e ignoreFields são campos separados por vírgula que você deseja ignorar na resposta.
fonte
@JsonIgnore
Resolvi usar apenas como sugeriu @kryger. Portanto, seu getter se tornará:Você pode definir o
@JsonIgnore
curso no campo, setter ou getter conforme descrito aqui .E, se você deseja proteger a senha criptografada apenas no lado da serialização (por exemplo, quando você precisa fazer o login de seus usuários), adicione esta
@JsonProperty
anotação ao seu campo :Mais informações aqui .
fonte
Eu encontrei uma solução para mim com Spring e Jackson
Primeiro especifique o nome do filtro na entidade
Então você pode ver a classe de nomes de filtros de constantes com o FilterProvider padrão usado na configuração de primavera
Configuração da mola:
Por fim, posso especificar um filtro específico em restConstoller quando preciso ...
fonte
Coloque
@JsonIgnore
no campo ou seu getter, ou crie um dto personalizadoou como mencionado acima,
ceekay
anote-o com@JsonProperty
onde o atributo de acesso está definido para escrever apenasfonte
Criar uma
UserJsonResponse
classe e preencher com os campos desejados não seria uma solução mais limpa?Retornar diretamente um JSON parece uma ótima solução quando você deseja devolver todo o modelo. Caso contrário, fica confuso.
No futuro, por exemplo, você pode querer ter um campo JSON que não corresponda a nenhum campo de modelo e então você está em um problema maior.
fonte
Esta é uma ferramenta de utilidade limpa para a resposta acima :
fonte
Em sua classe de entidade, adicione
@JsonInclude(JsonInclude.Include.NON_NULL)
anotações para resolver o problemavai parecer
fonte