WedX - журнал о программировании и компьютерных науках

JAX-RS/Лучшие практики организаций

В моем проекте я использую JAX-RS для предоставления некоторых объектов интерфейсной платформе javascript (AngularJS).

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

Чтобы сериализовать свою сущность в JSON/XML, я использую JAXB и добавляю идентификаторы отношений в класс. Теперь я получаю, что моя сущность является сущностью, а также DTO.

На каждом POST мне нужно вернуть ссылку на мою сущность.

Я хотел бы знать, является ли это подходящим способом разоблачения сущностей или есть лучшие способы?

Пример всегда понятнее, чем длинный текст, вот он:

@XmlRootElement
@Entity
public class Country {
    @Id
    @GeneratedValue
    private Integer id;

    private String countryName;

    @ManyToOne
    private Region region;

    @Transient
    private Integer regionId;

    // getters & setters

    // AVOID SERIALIZING REGION
    @XmlTransient
    public Region getRegion ...

    // SERIALIZE REGION ID INSTEAD
    public Integer getRegionId() {
        if (region != null)
            return region.getId();
        else
            return null;
    }

    ...

}

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
public class Region {
    @Id
    @GeneratedValue
    private Integer id;

    private String regionName;

    // getters & setters

    ...

}

@Stateless
@Path("countries")
public class CountryResource {

    @PersistenceContext
    private EntityManager em;

    @GET
    public List<Country> getAll() {
        return em.createNamedQuery("Country.findAll", Country.class).getResultList();
    }

    @PUT
    public void saveCountry saveCountry(Country country) {
        // UPDATE REFERENCES
        country.setRegion(em.getReference(Region.class, country.getRegionId()));
        em.persist(country);
    }

}

Вы предлагаете что-то другое?

Спасибо,

F.D

01.09.2014

Ответы:


1

Я считаю хорошей идеей использовать шаблон DTO в качестве "уровня защиты от коррупции". " и своего рода опубликованный API для тел веб-запросов/ответов.

Например, возьмем ваш класс Country. Если ваш веб-API отправляет вниз класс Country напрямую (прямо сериализованный в JSON), вы раскрываете части кода своего приложения, о которых потребители вашего веб-API, возможно, не должны знать, чтобы они не могли писать код, связанный с точками, которые подвержены изменять.

Таким образом, вы создаете класс «пакет свойств», который существует как представление общего «языка», который должны использовать ваши потребители и соавторы веб-API.

Например:

public class CountryDTO {
    public final Integer id;
    public final String countryName;
    public final Integer regionId;

    public CountryDTO(Country countryToSerialize){
        this.id = countryToSerialize.getId();
        this.countryName = countryToSerialize.getCountryName();
        this.regionId = countryToSerialize.getRegion().getId();
    }
}

Таким образом, если в будущем вы измените структуру своего класса Country, вашим потребителям API по-прежнему будет предоставляться та же согласованная «форма» данных (до тех пор, пока вы не откажетесь от поддержки/обновления/в зависимости от вашей практики управления версиями).

Вы также получаете детальный, независимый от библиотек контроль над сериализацией объектов домена, потому что вы можете выбирать, какие поля использовать.

Наконец, вам не нужно беспокоиться о извлечении сущностных объектов из запросов и путанице в том, считает ли ваш ORM их присоединенными/неприкрепленными/временными/независимо от того, когда вы передаете их коду своего приложения. Затем вы можете добавлять шаги проверки на основе строго временного DTO, прежде чем создавать экземпляр объекта домена.

01.09.2014
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]