Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 527 Vote(s) - 3.65 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Annotation-specified bean name conflicts with existing, non-compatible bean def

#1
I'm having a problem with some Spring bean definitions. I have a couple of context xml files that are being loaded by my main() method, and both of them contain almost exclusively a <context:component-scan> tag. When my main method starts up, I get this error from Spring:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl]

Both DAO classes are annotated this way:

@Repository("converterDAO")
public class StaticConverterDAOImpl implements ConverterDAO {
...
}

The in-memory dao also has the @Repository("converterDAO") annotation. The dao is referenced in other classes like this:

...
private @Autowired @Qualifier("converterDAO") ConverterDAO converterDAO;
...

I want one DAO to override the definition of the other one, which as I always understood it was one of the principal reasons to use a DI framework in the first place. I've been doing this with xml <bean> definitions for years and never had any problems. But not so with component scans and annotated bean definitions? And what does Spring mean when it says they are not "compatible"? They implement the same interface, and they are autowired into fields that are of that interface type. Why the heck are they not compatible?

Can someone provide me with a way for one annotated, component-scanned bean to override another?

Reply

#2
In an XML file, there is a sequence of declarations, and you may override a previous definition with a newer one. When you use annotations, there is no notion of *before* or *after*. All the beans are at the same level. You defined two beans with the same name, and Spring doesn't know which one it should choose.

Give them a different name (*staticConverterDAO*, *inMemoryConverterDAO* for example), create an alias in the Spring XML file (*theConverterDAO* for example), and use this alias when injecting the converter:

@Autowired @Qualifier("theConverterDAO")
Reply

#3
I had a similar issue with Spring 4.x using @RestController. Two different packages had a class with the same name...

package com.x.catalog

@RestController
public class TextureController {
...

package com.x.cms
@RestController
public class TextureController {
...

The fix was easy...

package com.x.catalog

@RestController("CatalogTextureController")
public class TextureController {
...

package com.x.cms
@RestController("CMSTextureController")
public class TextureController {
...

The problem seems to be that the annotation gets autowired and takes the class name by default. Giving it an explicit name in the @RestController annotation allows you to keep the class names.
Reply

#4
Scenario:
========
I am working on a multi-module Gradle project.

**Modules are:**

- core,
- service,
- geo,
- report,
- util and
- some other modules.

So primarily we have prepared a Component[**locationRecommendHttpClientBuilder**] in **geo** module.

Java Code:
========

import org.springframework.stereotype.Component

@Component("locationRecommendHttpClientBuilder")
class LocationRecommendHttpClientBuilder extends PanaromaHttpClientBuilder {
@Override
PanaromaHttpClient buildFromConfiguration() {
this.setURL(PanaromaConf.getInstance().getString("locationrecommend.url"))
this.setMethod(PanaromaConf.getInstance().getString("locationrecommend.method"))
this.setProxyHost(PanaromaConf.getInstance().getString("locationrecommend.proxy.host"))
this.setProxyPort(PanaromaConf.getInstance().getInt("locationrecommend.proxy.port", 0))
return super.build()
}
}

application-context.xml
=======================
<bean id="locationRecommendHttpClient"
class="au.co.google.panaroma.platform.logic.impl.PanaromaHttpClient"
scope="singleton" factory-bean="locationRecommendHttpClientBuilder"
factory-method="buildFromConfiguration" />

Then it is decided to add this component in **core** module.

One engineer has previous code for **geo** module and then he has taken the latest module of **core** but he forgot to take the latest **geo** module.

So the component[**locationRecommendHttpClientBuilder**] is double times in his project and he was getting the following error.

> `Caused by:
> org.springframework.context.annotation.ConflictingBeanDefinitionException:
> Annotation-specified bean name 'LocationRecommendHttpClientBuilder'
> for bean class
> [au.co.google.app.locationrecommendation.builder.LocationRecommendHttpClientBuilder]
> conflicts with existing, non-compatible bean definition of same name
> and class
> [au.co.google.panaroma.platform.logic.impl.locationRecommendHttpClientBuilder]`

Solution Procedure:
==================
After removal the component from **geo** module, component[**locationRecommendHttpClientBuilder**] is only available in **core** module. So there is no conflicting situation. Issue is solved by this way.
Reply

#5
I had a similar problem, and it was because one of my beans had been moved to another directory recently. I needed to do a "build clean" by deleting the `build/classes/java` directory and the problem went away. (The error message had the two different file paths conflicting with each other, although I knew one should not actually exist anymore.)
Reply

#6
I also had a similar problem. I built the project again and the issue was resolved.

The reason is, there are already defined sequences for the Annotation-specified bean names, in a file. When we do a change on that bean name and try to run the application Spring cannot identify which one to pick. That is why it shows this error.

In my case, I removed the previous bean class from the project and added the same bean name to a new bean class. So Spring has the previous definition for the removed bean class in a file and that conflicts with the newly added class while compiling. So if you do a 'build clean', previous definitions for bean classes will be removed and compilation will success.
Reply

#7
I faced this issue when I imported a two project in the workspace. It created a different jar somehow so we can delete the jars and the class files and build the project again to get the dependencies right.
Reply

#8
Sometimes the problem occurs if you have moved your classes around and it refers to old classes, even if they don't exist.

In this case, just do this :

mvn eclipse:clean

mvn eclipse:eclipse

This worked well for me.
Reply

#9
**Explanation internal working on this error**

You are getting this error because after instantiation the container is trying to assign same object to both classes as class name is same irrespective of different packages......thats why error says non compatible bean definition of same name ..

Actually how it works internally is--->>>>.

pkg test1;
….
@RestController
class Test{}

pkg test2;
….
@RestController
class Test{}

First container will get class Test and @RestController indicates it to instantiate as…test = new Test(); and it won’t instantiate twice
After instantiating container will provide a reference variable test(same as class name) to both the classes and while it provide test reference
To second class it gets non compatible bean definition of same name ……

Solution—>>>>

Assign a refrence name to both rest controller so that container won’t instantiate with default name and instantiate saperately for both classes irrespective
Of same name

For example——>>>

pkg test1;
….
**@RestController(“test1”)**
class Test{}

pkg test2;
….
**@RestController(“test2”)**
class Test{}

**Note**:The same will work with @Controller,@Service,@Repository etc..

**Note**: if you are creating reference variable at class level then you can also annotate it with @Qualifier("specific refrence name") for example
@Autowired @Qualifier("test1")
Test test;
Reply

#10
I had a similar problem, with two jar libraries (app1 and app2) in one project. The bean "BeanName" is defined in app1 and is extended in app2 and the bean redefined with the same name.

In app1:

package com.foo.app1.pkg1;

@Component("BeanName")
public class Class1 { ... }

In app2:

package com.foo.app2.pkg2;

@Component("BeanName")
public class Class2 extends Class1 { ... }

This causes the <code>ConflictingBeanDefinitionException</code> exception in the loading of the applicationContext due to the same component bean name.

To solve this problem, in the Spring configuration file `applicationContext.xml`:
``` lang-xml
<context:component-scan base-package="com.foo.app2.pkg2"/>
<context:component-scan base-package="com.foo.app1.pkg1">
<context:exclude-filter type="assignable" expression="com.foo.app1.pkg1.Class1"/>
</context:component-scan>
```

So the Class1 is excluded to be automatically component-scanned and assigned to a bean, avoiding the name conflict.
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through