2010-04-15 9 views
5

Tengo una construcción de sitio web con Spring y jpa (por hibernación). Tengo un error y no sé cómo identificar la línea donde aparece el error.¿Cómo saber la línea de un error en un bean generado en primavera?

No puedo depurarlo en mi ide porque es una versión en vivo (todo funciona bien en local).

Tengo registro que dice: o

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) 

Mi problema es la tercera línea. Como el objeto UserService es manejado por Spring, se convierte en un proxy y no puedo conocer la línea del error.

¿Sabes cómo resolver el problema?

Gracias

+0

Me gustaría saber la respuesta también, pero lo que suelo hacer en ese caso es la depuración del hombre pobre: ​​inserte un montón de llamadas de registrador en un método y vea en qué línea se detiene. – serg

+0

sí, es lo que hago también. Pero como mi producto es en vivo, significa crear registros, volver a compilar, enviarlo al servidor y ver. Oh no, olvidé un registro, hago todo el trabajo ... Realmente mal ... –

+0

¿Puedes publicar el registro completo y proporcionar más detalles para el error? –

Respuesta

3

¿Es posible cambiar de cglib a jdk proxy? (Spring AOP proxy reference)

Básicamente: si accede a sus beans como interfaces, puede usar los proxys jdk (mecanismo predeterminado de primavera), dejando intacto el objeto subyacente y obteniendo acceso a los números de línea en los rastros de pila.

+0

esto parece ser una buena solución, pero ¿hay algún tipo de problema de rendimiento o problema con este modelo diferente? –

+0

no que yo sepa. como dije: es la forma estándar de hacer las cosas en primavera, miles (tal vez millones) de servidores lo usan. Si se inyectan sus servicios como interfaces, no como clases, Spring utilizará automáticamente los proxies jdk. –

+0

gracias lo intentaré! –

0

diría que no ser capaz de reproducir este local es una restricción significativa. Intentaría configurar su entorno local o un servidor de prueba para reproducir el problema, utilizando JMeter u otro software de prueba de carga para simular la carga de los accesos concurrentes de los usuarios. Una vez hecho esto, su ciclo de ajuste/compilación/prueba se vuelve mucho más corto, y puede realizar cambios experimentales sin temor a interrumpir el servicio en su servidor de producción. Puede parecer mucho esfuerzo, pero el trabajo rendirá dividendos no solo por este error, sino también por los errores que pueda encontrar en el futuro.

Parece que podría ser un error de enhebrado, especialmente porque la primavera usa de forma predeterminada el alcance de singleton. Con esto en mente, busque crear pruebas de integración de subprocesos múltiples para el servicio que está fallando. Una vez que haya reproducido el error a través de la prueba de carga, puede verificar que se trata de un error de subprocesamiento haciendo su método de servicio principal synchronized, evitando el uso concurrente. Si el error desaparece, lo más probable es que sea un error de concurrencia.

En cuanto a encontrar la línea del error, no hay línea que buscar desde que se genera el código. Lo mejor que puede hacer es agregar comprobaciones defensivas en todos los beans que se utilizan en el asesoramiento en torno a UserService. (Por ejemplo, verificar valores nulos debido a inyecciones faltantes). El atributo init-method en beans es útil para realizar comprobaciones de que el bean se ha construido completamente y se han establecido todos los colaboradores necesarios.

0

Si no puede reproducir el problema en el entorno local, puede ser un problema relacionado con el entorno o la red. Primero, recrearía el problema en el entorno de prueba (que está más cerca del entorno de producción y no solo del propio equipo local) para depurar el error.

También puede usar Fiddler para depurar problemas relacionados con la red para una versión en vivo.

Cuestiones relacionadas