Thursday, February 4, 2016

java.lang.LinkageError: loader constraint violation org/slf4j/ILoggerFactory

Getting following exception bringing up a Spring Application on Weblogic 11g while trying to instantiate a Spring Controller.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController' defined in
URL [zip:D:/weblogic/servers/AdminServer/tmp/_WL_user/cservice-ws-ear-1/fd4930/war/WEB-INF/lib/_wl_cls_gen.jar!/
com/testapp/web/controller/TestController.class]:
Instantiation of bean failed; nested exception is java.lang.LinkageError: loader constraint violation:
when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;"
the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class, org/slf4j/LoggerFactory,
and the class loader (instance of weblogic/utils/classloaders/GenericClassLoader) for resolved class, org/slf4j/impl/StaticLoggerBinder,
have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)

Fix:

This is happening due to the conflict between my ear lib and weblogic provided slf4j jars. I found a workaround to run this ear on my local. I set the prefer-web-inf-classes to false in weblogic.xml under WEB-INF

<wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>

The above would use the file provided by weblogic even if it exists in ear lib.

Here is sample weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee       http://java.sun.com/xml/ns/javaee/javaee_5.xsd       http://xmlns.oracle.com/weblogic/weblogic-web-app       http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">

<wls:container-descriptor>
<wls:prefer-web-inf-classes>false</wls:prefer-web-inf-classes>
</wls:container-descriptor>
    <wls:context-root>deskrev</wls:context-root>

</wls:weblogic-web-app>

Caused By: org.springframework.beans.factory.BeanCreationException: Could not autowire field:

Getting following exception bringing up a Spring Application while trying to instantiate a Spring bean. I have defined the bean and autowired it in my spring controller:

Here is my service. Spring should be instantiated when I bring up the application.

@Service("nameFinderService")
@Lazy(true)
public class NameFinderServiceImpl implements INameFinderService {

}

Here is my Controller where I have autowired the above service:

@Controller
public class MainController{

@Autowired
private INameFinderService nameFinderService;

}

Full Stacktrace:

Caused By: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.nmservice.web.service.INameFinderService com.nmservice.web.base.controller.MainController.nameFinderService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.nmservice.web.service.INameFinderService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:241)



Fix : The package specified in component-scan in spring configuration was specified to a more specific package as I had my spring files in that package, The new spring bean existed one level higher in package. That was the reason it could not find the bean.

I change the following one level up,

from this
<context:component-scan base-package="com.nmservice.web.base" />
to 
<context:component-scan base-package="com.nmservice.web" />

And the issue got resolved.

Tuesday, February 2, 2016

Android Studio - Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.CoordinatorLayout"

Getting following exception while trying to run a Test app. My Activity extends AppCompatActivity.

The exception is thrown when I call setContentView with activity name under onCreate() method.

setContentView(R.layout.activity_welcome_screen);

I see the underlying issue is following :

Suppressed: java.lang.ClassNotFoundException: android.support.design.widget.CoordinatorLayout

Here is the full stack trace:

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.design.widget.CoordinatorLayout" on path: DexPathList[[zip file "/data/app/com.mobile.app.android-2/base.apk"],nativeLibraryDirectories=[/data/app/com.
is.mobile.app.android-2/lib/arm64, /vendor/lib64, /system/lib64]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
            at android.view.LayoutInflater.createView(LayoutInflater.java:578)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:750)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:483) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
            at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256) 
            at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)                         
            at android.app.Activity.performCreate(Activity.java:6550) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3108) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263) 
            at android.app.ActivityThread.access$1000(ActivityThread.java:197) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:145) 
            at android.app.ActivityThread.main(ActivityThread.java:6897) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
            Suppressed: java.lang.ClassNotFoundException: android.support.design.widget.CoordinatorLayout
            at java.lang.Class.classForName(Native Method)
            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 23 more
             Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
02-02 11:46:56.471 28238-28238/com.mobile.app.android I/Process: Sending signal. PID: 28238 SIG: 9