Весенний отдых. Устранить свойство 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, но он не работает, вместо этого он работает для поля пароля. (это свойство видно только для записи / публикации).

Подскажите пожалуйста, где я не прав? или если есть более элегантный способ сделать это?

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

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

Другие вопросы по тегам