Лучшая практика для Spring инициализация дерева объектов поддержки формы MVC

Поскольку ваша функция ничего не возвращает, Mongoose exec ((err, user)) выходит за рамки вашей функции, а также вы уже используете асинхронные функции, почему бы вам не использовать синтаксис await.

Здесь, быстрый переписать ваш код.

module.exports = async (request, email, password, h) => {
    if (!email || !password) {
        return {
          isValid: false,
          credentials: null
        }
    }

    try
    {
        const user = await User.findOne({ email, role: 'admin' }).exec();

        // user doesn't exist
        if(!user){
            return Boom.unauthorized('You must be admin user');
        }

        // we found the user, let's authenticate
        request.adminUser = currentUser;
        return {
          isValid: true,
          credentials: currentUser
        }
    } catch(e){
        // handle other errors
        return Boom.badRequest(e);
    }   
};
7
задан Jacob Mattison 18 December 2008 в 14:50
поделиться

4 ответа

Назовите это излишеством, если Вам нравится, но что мы на самом деле закончили тем, что делали, должен был создать универсальную фабрику, которая будет брать любой объект и использовать отражение, чтобы (рекурсивно) найти все пустые свойства и инстанцировать объекта корректного типа. Я сделал этот Apache использования палата общин BeanUtils.

Таким образом, можно взять объект, который Вы, возможно, получили от различных источников (ДАО, десериализация от XML, безотносительно), передаете его через эту фабрику и используете его в качестве поддерживающего форму объекта, не волнуясь, что что-то, в чем Вы нуждаетесь для привязки, может быть пустым.

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

4
ответ дан 7 December 2019 в 03:21
поделиться

Я предполагаю, что Вы говорите о чем-то как < form:input path="person.contactInfo.homeAddress.street"/> ? Не ясный для меня, но принятия я прав :):

1) Да, Когда Вы пишете person.contactInfo.homeAddress.street , читать person.getContactInfo().getHomeAddress().getStreet(). Если ContactInfo или HomeAddress или уличные объекты являются пустыми, вызов одного из их метода повышает NullPointException.

2) Я обычно инициализирую членские объекты в объявлении, точно так же, как во фрагменте кода. Не смотрите преимущество класса фабрики, чтобы сделать задание, если значения инициализации безусловны. Я ясно не вижу проблемы, где Вы вынуждены создать Человека дважды..., но я могу устать ;)

1
ответ дан 7 December 2019 в 03:21
поделиться

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

public static Person getInstanceForContactInfoForm() {
      ContactInfo contactInfo = ContactInfo.getInstanceForContactInfoForm();

      Person person = new Person(contactInfo);
      // set whatever other properties you need for Person
      // just enough to 1-render the form and 2-avoid any exceptions
      return person;
}

Если я загружаю Человека из базы данных, у меня есть метод в классе Человека, названном чем-то как "initalizeForContactInfoForm" или что-то. После загрузки Человека от базы данных я назову этот метод на Уровне служб в методе, который называет Spring методом MVC, который возвращает Объект Поддержки Формы.

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

1
ответ дан 7 December 2019 в 03:21
поделиться

Я обычно удостоверялся бы, что объекты полностью инициализируются - это делает использование объекта так большим количеством simplier и избегает, чтобы Вы рассеивающий пустой указатель проверили всюду по своему коду.

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

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

Когда дело доходит до связей "один ко многим" я обычно иду для ленивой загрузки. Будьте в спящем режиме возьмет этого для Вас, но если Вы прокручиваете свое собственное затем, Вам просто нужна пользовательская реализация Списка, который называет соответствующий ДАО, когда любой из методов, касающихся его содержания, называют.

Одно исключение к этому поведению со связями "один ко многим" - когда у Вас есть список родительских объектов, которых Вы намереваетесь выполнить итерации, и для каждого родителя Вы хотите выполнить итерации по его детям. Очевидно, производительность высосала бы, потому что Вы будете делать n + 1 вызов к DB, когда Вы могли на самом деле сделать это с 2 вызовами.

3
ответ дан 7 December 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: