Весной, почему номера строк теряются для CGLib в POJO? - PullRequest
0 голосов
/ 01 июля 2011

Spring MVC веб-приложение:

У меня есть трассировка стека без номеров строк (показано внизу).

Я предполагаю, что это связано с работой CGLib на контроллере.Но это странно для меня, фактическое исключение происходит в ServerBatchRemoteRequestAcceptor, pojo, который не вводится, а не контроллер.Он создается только в объекте Controller.

Пример:

@Controller
class MyController {
    MyPojo pojo = new MyPojo();

    @RequestMapping("myaction")
    public void doMyAction(){
        pojo.methodToCauseNullPointerException()
    }
}

java.lang.NullPointerException
at mycommons.services.batchremoteprocessor.ServerBatchRemoteRequestAcceptor.acceptRequest(Unknown Source)
at com.proxyandvpn.web.controllers.RESTServicesController.handleGenericClientRequest(Unknown Source)
at com.proxyandvpn.web.controllers.RESTServicesController$$FastClassByCGLIB$$dff24f0f.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)

Может кто-нибудь объяснить мне это поведение?Будут ли все вызовы под моими контроллерами без номеров строк из-за CGLib?

Должен ли я записывать свои контроллеры в интерфейс, чтобы использовать прокси?Это нормально?Я делаю это для сервисов, но сделал контроллеры простыми POJO.

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Spring использует CGLIB для генерации прокси-объектов, которые находятся перед некоторыми из ваших компонентов / контроллеров.Вызовы к этим компонентам проходят через прокси-серверы CGLIB.Эти прокси генерируются во время выполнения без исходного кода, поэтому у них нет номеров строк.

Вы можете в значительной степени игнорировать строки трассировки стека, в которых упоминается CGLIB, - притвориться, что их нет, онипрозрачный.

В трассировке стека вызов RESTServicesController.handleGenericClientRequest был проксирован, но вызов все еще поступает.NPE происходит в пределах ServerBatchRemoteRequestAcceptor, который вызывается из RESTServicesController.handleGenericClientRequest.

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

1 голос
/ 03 июля 2011

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

Недавно я переключился на использование сборок ANT вместо Eclipse Builder.Я не осознавал, что мне нужно было явно включить отладочную информацию в задаче.Я невольно обвинил CGLib, когда увидел, что он стоит перед этой ошибкой, но все, что было необходимо, это модификация сборки ANT.

...