Весенний отдых. Удалите свойство json в HTTP.POST

Я пытаюсь исключить возможность изменения поля json при операции HTTP.POST. Это мой класс:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserModel {

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Long userId;

    @NotNull
    private String username;

    private RoleModel role;

    @NotNull
    private String email;

    @NotNull
    private String firstName;

    @NotNull
    private String secondName;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Date registrationDate;
}

Я хочу, например, чтобы свойство userId было доступно только для чтения (http get). Я пробовал с @JsonProperty, но это не работает, вместо этого оно работает для поля пароль. (это свойство видно только для записи/публикации).

Не могли бы вы сказать мне, где я не прав? или если есть более элегантный способ сделать это?

Большое спасибо,


person Rapidistul    schedule 15.02.2018    source источник
comment
Это должно помощь.   -  person Andrew S    schedule 15.02.2018
comment
Спасибо, @AndrewS, я все еще ищу другое решение. Как видите, я использую ломбок и не хочу писать конструкторы для доменных классов.   -  person Rapidistul    schedule 15.02.2018


Ответы (1)


Вы можете добиться этого с помощью аннотации @JsonView:

// Declare views as you wish, you can also use inheritance.
// GetView also includes PostView's fields 
public class View {
    interface PostView {}
    interface GetView extends PostView {}
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserModel {

    @JsonView(View.GetView.class)
    private Long userId;

    @JsonView(View.PostView.class)
    @NotNull
    private String username;
    ....
}

@RestController
public class Controller {

    @JsonView(View.GetView.class)
    @GetMapping("/")
    public UserModel get() {
        return ... ;
    }

    @JsonView(View.PostView.class)
    @PostMapping("/")
    public UserModel post() {
        return ... ;
    }

...
}

Для получения дополнительной информации: https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring

person Ghokun    schedule 18.02.2018