ApplicationError при попытке реализовать отредактированную версию безопасного модуля

Я реализую отредактированную версию безопасного контроллера по умолчанию в последней версии Play Framework.

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

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

    Execution exception
NullPointerException occured : null

In /app/controllers/SecureController.java (around line 194)

190:
                 security = classes.get(0);
191:
             }
192:
             if(security==null)System.out.println("security is null");
193:
             try {
194:
                 return Java.invokeStaticOrParent(security, m, args);
195:
             } catch(InvocationTargetException e) {
196:
                 throw e.getTargetException();
197:
             }
198:
         }
199:

200:
     }

Первый логический вывод, к которому следует перейти: не существует классов, реализующих необходимый внутренний класс Secure$Security. Но наверняка есть подкласс, поэтому мне было интересно, как можно исправить эту ошибку.

Сеанс отладки узнает, что class.get(0) действительно содержит класс с аннотацией @With. Таким образом, исключение нулевого указателя должно быть вызвано чем-то внутри класса, содержащего @With(SecureController). Но я оставил этот класс таким, каким он был, я просто отредактировал ссылку в аннотации With.

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

РЕДАКТИРОВАТЬ: я нашел причину этой ошибки, но «почему» не ясно. Эта строка находится в реализации метода authentication(...) в подклассе SecureController$Security:

flash.put("url", request.url);

Почему это не удается?

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

Спасибо за помощь (во многих темах, связанных с Play!).


person Jasper    schedule 29.03.2011    source источник
comment
У меня такое чувство, что объект запроса - это не то, что мне нужно, когда я хочу узнать, где был вызван контроллер... предложения?   -  person Jasper    schedule 29.03.2011
comment
Странно, я прочитал код безопасного модуля из 1.1.1 и мне интересно, у вас такой же код, как у меня :)... что вы делаете, чтобы проверить свой безопасный модуль? вы что-то меняли в коде? у вас есть полная трассировка стека, было бы поучительно... с уважением   -  person mandubian    schedule 30.03.2011
comment
@mandubian Спасибо за ответ. Как я уже сказал в посте выше, я настраиваю безопасный модуль по своему усмотрению. Мне посоветовали так сделать, что я и сделал :) Тестирую с небольшим .yml, который создает нового пользователя в membased-db. Теперь, когда я реализовал свое решение (см. редактирование в моем посте), похоже, я не могу воспроизвести ошибку. Я предполагаю, что где-то я ссылался на объект request.url, который в то время был нулевым. Я читаю здесь и там, вы должны использовать response.getCurrent().getHeader(url). Это правильно?   -  person Jasper    schedule 30.03.2011
comment
Это зависит от того, где вы находитесь и где вы вызываете код... Я думаю, что это тоже не правильный код... что-то вроде Request request = Request.current(); было бы лучше... Если вы находитесь в контроллере, запрос threadlocal должен быть предоставлен Play, поэтому, если ваш запрос нулевой, это означает, что вы находитесь вне классического механизма контроллера из Play... без вашего кода я не могу сказать намного больше...   -  person mandubian    schedule 30.03.2011


Ответы (1)


класс Scope.Flash не позволяет хранить значения null. Возможно, вы отключили или не установили request.url где-то еще в своих модификациях?

person Brad Mace    schedule 24.06.2011