Spring Boot и Jackson: определите, какие поля для сериализации во внешнем классе - PullRequest
1 голос
/ 20 сентября 2019

Я работаю над проектом api rest с весенней загрузкой и гибернацией, и мне интересно узнать о сериализации json RestController с использованием Jackson.

Вот проблема: я использую класс внешних сущностей гибернации, определенный вбиблиотека, которую я не могу редактировать.Эти классы очень сложны и определяют много полей, которые меня не интересуют, когда я возвращаю объект с остальными API.

На самом деле, я решил проблему с обёртыванием исходного класса классом-оберткой, который предоставляеттолько значения, которые я хочу вернуть из контроллера.

Например:

оригинальный класс

class AccountEntity {
///...

public String getName() {
   return this.name;
}

/// ... Lot of code here
}

Класс оболочки:

class AccountWrapper {

AccountEntity original;

public AccountWrapper(AccountEntity original) {
   this.original = original;
}

public String getName() {
   return this.original.getName();
}
}

и использование оболочки следующим образом

@RestController("/api/user")
public class UsersController {
    @GetMapping("/")
    public AccountWrapper getUser() {
        AccountEntity account = //get account in some way
        AccountWrapper accountWrapper = new AccountWrapper(account);
        return accountWrapper;
    }
}

Метод работает хорошо, но он не очень чистый и делает вещи более сложными (например, когда мне нужно возвращать списки), потому что я всегда должен оборачивать исходный класс.

Я не нашел метода, который позволил бы мне указать, какие поля я хочу сериализовать без изменения (и не могу) исходного класса.

Любая помощь?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Вместо использования класса-оболочки создайте объект DTO для остального API, который будет меньше, чем сущность БД, и trasformer для создания DTO из сущности (и наоборот)

Отличие от использованияОбертка заключается в том, что сущность DB не является частью DTO и, следовательно, не нуждается в сериализации в ответе.

Большим преимуществом здесь является то, что вы отделяете слой DB от уровня API, которыйделает его более гибким и простым в управлении.

вы можете узнать больше об этом шаблоне здесь

0 голосов
/ 20 сентября 2019

По-видимому, вы можете использовать Джексона Миксинса , чтобы аннотировать класс аннотациями Джексона.

См. этот ответ , например.

Идеясоздать класс с нужными вам аннотациями и использовать objectMapper.getSerializationConfig().addMixInAnnotations() для регистрации MixIn в вашем классе.

Например:

//Class you don't controll
public class User {
  private String name;
  private String password; //attribute we want to omit

  //... getters and setters
}
public abstract class UserMixIn {
  @JsonIgnore String getPassword();
}
objectMapper.addMixInAnnotations(User.class, UserMixIn.class);

Надеюсь, этопомогает,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...