У меня есть такой класс модели для спящего режима
@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;
}
}
В контроллере Spring MVC, используя DAO, я могу получить объект. и возвращается как объект 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;
}
}
Часть просмотра выполняется с использованием AngularJS, поэтому он получит такой JSON
{
"userId" :2,
"userName" : "john",
"emailId" : "john@gmail.com",
"encryptedPwd" : "Co7Fwd1fXYk=",
"createdBy" : null,
"updatedBy" : null
}
Если я не хочу устанавливать зашифрованный пароль, я также установлю это поле как null.
Но я не хочу этого, я не хочу отправлять все поля клиентской стороне. Если мне не нужны поля password, updatedby, createdby для отправки, мой результат JSON должен быть похож на
{
"userId" :2,
"userName" : "john",
"emailId" : "john@gmail.com"
}
Список полей, которые я не хочу отправлять клиенту из другой таблицы базы данных. Таким образом, он будет меняться в зависимости от пользователя, который вошел в систему. Как я могу это сделать?
Надеюсь, у вас есть вопрос.
java
json
hibernate
spring-mvc
iCode
источник
источник
Ответы:
Добавьте
@JsonIgnoreProperties("fieldname")
аннотацию к вашему POJO.Или вы можете использовать
@JsonIgnore
перед именем поля, которое вы хотите игнорировать при десериализации JSON. Пример:Пример GitHub
источник
@JsonIgnore
этоcom.fasterxml.jackson.annotation.JsonIgnore
неorg.codehaus.jackson.annotate.JsonIgnore
.Я знаю, что немного опаздываю на вечеринку, но я действительно столкнулся с этим несколько месяцев назад. Все доступные решения мне не очень нравились (миксины? Тьфу!), Поэтому в итоге я создал новую библиотеку, чтобы сделать этот процесс чище. Он доступен здесь, если кто-то захочет попробовать: https://github.com/monitorjbl/spring-json-view .
Базовое использование довольно простое, вы используете
JsonView
объект в своих методах контроллера следующим образом:Вы также можете использовать его вне Spring:
источник
Создать класс представления:
Аннотируйте вашу модель
Укажите класс представления в вашем контроллере
Пример данных:
источник
Мы можем сделать это, установив доступ к
JsonProperty.Access.WRITE_ONLY
при объявлении свойства.источник
Добавить
@JsonInclude(JsonInclude.Include.NON_NULL)
(заставляет Джексона сериализовать нулевые значения) как в класс, так и@JsonIgnore
в поле пароля.Вы, конечно, можете установить
@JsonIgnore
createdBy и updatedBy, если вы всегда хотите игнорировать это, а не только в этом конкретном случае.ОБНОВИТЬ
Если вы не хотите добавлять аннотацию к самому POJO, отличный вариант - это Mixin Annotations Джексона. Ознакомьтесь с документацией
источник
Да, вы можете указать, какие поля сериализуются как ответ JSON, а какие игнорировать. Это то, что вам нужно сделать, чтобы реализовать динамическое игнорирование свойств.
1) Во-первых, вам нужно добавить @JsonFilter из com.fasterxml.jackson.annotation.JsonFilter в свой класс сущности как.
2) Затем в вашем контроллере вы должны добавить создать объект MappingJacksonValue и установить для него фильтры, и, в конце концов, вы должны вернуть этот объект.
Вот что вы получите в ответ:
вместо этого:
Здесь вы можете увидеть, что он игнорирует другие свойства (в данном случае field3) в ответе, за исключением свойств field1 и field2.
Надеюсь это поможет.
источник
На вашем месте я бы не использовал свой объект User на уровне контроллера. Вместо этого я создаю и использую UserDto (объект передачи данных) для связи с уровнем бизнеса (службы) и контроллером. Вы можете использовать Apache BeanUtils (метод copyProperties) для копирования данных из объекта User в UserDto.
источник
Я создал JsonUtil, который можно использовать для игнорирования полей во время выполнения при отправке ответа.
Пример использования: первым аргументом должен быть любой класс POJO (студент), а ignoreFields - это поля, разделенные запятыми, которые вы хотите игнорировать в ответ.
источник
Я решил использовать только
@JsonIgnore
то, что предложил @kryger. Итак, ваш получатель станет:Вы можете,
@JsonIgnore
конечно, установить поле, сеттер или получатель, как описано здесь .И, если вы хотите защитить зашифрованный пароль только на стороне сериализации (например, когда вам нужно войти в систему своих пользователей), добавьте эту
@JsonProperty
аннотацию в свое поле :Больше информации здесь .
источник
Я нашел решение для себя с помощью Spring и jackson
Сначала укажите имя фильтра в сущности
Затем вы можете увидеть класс имен фильтров констант с FilterProvider по умолчанию, используемым в конфигурации Spring.
Конфигурация пружины:
В конце концов, я могу указать конкретный фильтр в restConstoller, когда мне нужно ....
источник
Поместите
@JsonIgnore
в поле или его геттер, или создайте собственный dtoили, как упоминалось выше,
ceekay
аннотируя его,@JsonProperty
где атрибут доступа установлен только на записьисточник
Разве создание
UserJsonResponse
класса и заполнение нужными полями не было бы более чистым решением?Прямой возврат JSON кажется отличным решением, если вы хотите вернуть всю модель. В противном случае будет просто беспорядок.
В будущем, например, вы можете захотеть иметь поле JSON, которое не соответствует ни одному из полей модели, и тогда у вас будут большие проблемы.
источник
Это чистая утилита для приведенного выше ответа :
источник
В вашем классе сущности добавьте
@JsonInclude(JsonInclude.Include.NON_NULL)
аннотацию для решения проблемы.это будет выглядеть как
источник