Только с помощью @JsonIgnore во время сериализации, но не десериализации
у меня есть объект пользователя, который отправляется на сервер. Когда я отправляю объект пользователя, я не хочу отправлять хэшированный пароль клиенту. Поэтому я добавил @JsonIgnore в свойстве password, но это также блокирует его десериализацию в Пароль, что затрудняет регистрацию пользователей, когда у них нет пароля.
как я могу получить только @JsonIgnore чтобы применить к сериализации, а не десериализации? Я использую Spring JSONView, поэтому у меня нет тонны контроля через ObjectMapper.
вещи, которые я пробовал:
- добавить
@JsonIgnoreв собственность - добавить
@JsonIgnoreтолько на методе getter
5 ответов:
точно, как это сделать, зависит от версии Джексона, которую вы используете. Это изменилось вокруг версии 1.9, до этого, вы могли бы сделать это путем добавления
@JsonIgnoreв геттер.который вы пробовали:
добавить @JsonIgnore только для метода getter
этого и добавить
@JsonPropertyаннотация для вашего имени Поля JSON "пароль" к методу setter для пароля на вашем объект.более поздние версии Джексона добавили
READ_ONLYиWRITE_ONLYаргументы аннотацииJsonProperty. Так что вы также можете сделать что-то вроде:@JsonProperty(access = Access.WRITE_ONLY) private String password;документы можно найти здесь.
для того, чтобы сделать это, все, что нам нужно, это две аннотации :
@JsonIgnore@JsonPropertyиспользовать
@JsonIgnoreна член класса и его добытчик. Используйте@JsonPropertyна его сеттера.пример иллюстрации поможет сделать это:
class User{ // More fields here @JsonIgnore private String password; @JsonIgnore public String getPassword() { return password; } @JsonProperty public void setPassword(String password) { this.password = password; } }
начиная с версии 2.6: более интуитивно понятным способом является использование
com.fasterxml.jackson.annotation.JsonPropertyзаметка на поле:@JsonProperty(access = Access.WRITE_ONLY) private String myField;даже если геттер существует, значение поля исключается из сериализации.
JavaDoc говорит:
/** * Access setting that means that the property may only be written (set) * for deserialization, * but will not be read (get) on serialization, that is, the value of the property * is not included in serialization. */ WRITE_ONLYв случае, если вам нужно, наоборот, просто использовать
Access.READ_ONLY.
в моем случае у меня есть Джексон автоматически сериализует / десериализует объекты, которые я возвращаю из контроллера Spring MVC (я использую @RestController с Spring 4.1.6). Я должен был использовать
com.fasterxml.jackson.annotation.JsonIgnoreвместоorg.codehaus.jackson.annotate.JsonIgnore, иначе он просто ничего не делал.
"user": { "firstName": "Musa", "lastName": "Aliyev", "email": "klaudi2012@gmail.com", "passwordIn": "98989898", (or encoded version in front if we not using https) "country": "Azeribaijan", "phone": "+994707702747" }
@CrossOrigin(methods=RequestMethod.POST) @RequestMapping("/public/register") public @ResponseBody MsgKit registerNewUsert(@RequestBody User u){ root.registerUser(u); return new MsgKit("registered"); }
@Service @Transactional public class RootBsn { @Autowired UserRepository userRepo; public void registerUser(User u) throws Exception{ u.setPassword(u.getPasswordIn()); //Generate some salt and setPassword (encoded - salt+password) User u=userRepo.save(u); System.out.println("Registration information saved"); } }
@Entity @JsonIgnoreProperties({"recordDate","modificationDate","status","createdBy","modifiedBy","salt","password"}) public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String country; @Column(name="CREATED_BY") private String createdBy; private String email; @Column(name="FIRST_NAME") private String firstName; @Column(name="LAST_LOGIN_DATE") private Timestamp lastLoginDate; @Column(name="LAST_NAME") private String lastName; @Column(name="MODIFICATION_DATE") private Timestamp modificationDate; @Column(name="MODIFIED_BY") private String modifiedBy; private String password; @Transient private String passwordIn; private String phone; @Column(name="RECORD_DATE") private Timestamp recordDate; private String salt; private String status; @Column(name="USER_STATUS") private String userStatus; public User() { } // getters and setters }