Как узнать строку ошибки в сгенерированном бобе? - PullRequest
5 голосов
/ 15 апреля 2010

У меня есть сборка сайта с использованием Spring и jpa (от hibernate). У меня ошибка, и я не знаю, как определить строку, где эта ошибка появляется.

Я не могу отладить его на своем ide, потому что это живая версия (все отлично работает на локальном компьютере).

У меня есть журнал, который говорит: о

rg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)#012#011

at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)#012#011

at com.mycompany.server.rpc.UserService$$EnhancerByCGLIB$$64ed2d4f.createAccount(<generated>)#012#011

at com.mycompany.server.rpc.ServiceRPCImpl.createAccount(ServiceRPCImpl.java:309)

Моя проблема в третьей строке. Поскольку объект UserService обрабатывается Spring, он становится прокси, и я не могу знать строку ошибки.

Знаете ли вы, как решить проблему?

* +1011 * Спасибо

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Возможно ли вам перейти с cglib на jdk proxy? ( Ссылка на Spring AOP-прокси )

В основном: если вы обращаетесь к своим bean-компонентам как к интерфейсам, вы можете использовать прокси-серверы jdk (механизм пружинного механизма по умолчанию), тем самым оставляя базовый объект нетронутым и получая доступ к номерам строк в трассировке стека.

0 голосов
/ 17 августа 2010

Если вы не можете воспроизвести проблему в локальной среде, возможно, это проблема среды или сети. Сначала я воссоздаю проблему в тестовой среде (которая ближе к производственной среде, а не просто к локальной машине) для устранения ошибки.

Вы также можете использовать Fiddler для отладки проблем, связанных с сетью, для живой версии.

0 голосов
/ 13 августа 2010

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

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

Что касается нахождения строки ошибки - нет никакой строки, чтобы искать, так как код генерируется. Лучшее, что вы можете сделать, это добавить защитные проверки во все bean-компоненты, которые используются в совете вокруг UserService. (Например, проверьте нулевые значения из-за отсутствующих инъекций.) Атрибут init-method в bean-компонентах полезен для выполнения проверок того, что bean-компонент полностью построен и все необходимые соавторы установлены.

...