unable to Autowire in Spring - java

I now this have been raised here before, but I really tried to use the discussions but none worked for me.
Basically I'm getting the "The prefix "context" for element "context:annotation-config" is not bound" error which I use #Autowired to exclude the use of property element in the beans xml.
Here is the tag of my xml file
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
I also have the
<context:annotation-config/>
which automatically registers the AutowiredAnnotationBeanProcessor
could the problem might be from a missing jar in the classpath, that a maping between namespaces and spring jars can't be made? here are the external jars
org.springframework.aop-3.1.0.M2
org.springframework.asm-3.1.0.M2
org.springframework.beans-3.1.0.M2
org.springframework.context.support-3.1.0.M2
org.springframework.context-3.1.0.M2
org.springframework.core-3.1.0.M2
org.springframework.expression-3.1.0.M2
spring-context-3.0.6
spring-beans-3.0.6
commons-logging-1.1.1

What you are missing is the namespace prefix declaration:
<beans xmlns:context="http://www.springframework.org/schema/context">

Related

How do I resolve “Element bean is not allowed here” when configuring the XML file?

I was creating a simple Java project by importing 4 major jar packages of Spring(beans, core, context and expression, all are ver 5.2.6). However, IDEA kept indicating that "element bean is not allowed here" even though I checked repeatedly that the dependencies are placed correctly in the module section and restarted the IDE. The configuration is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--Creating User Object-->
<bean id = "user" class = "com.zhouss.User"><bean/> #bean is where it reports error
</beans>
And here's a snapshot of the dependency jars:
I'm a complete newbie on Spring, how do I resolve the issue?
As it turned out, it was a problem with the particular version of IDEA (2020.3, mac), I have updated to the latest version of 2022.1, mac and the error simply disappears by themselves.
I found very little info online when I tried to resolve this problem, so I find it necessary to write down my findings.

Enable Spring Project Nature in STS 4 to fix XML Schema problems

I'm trying to apply the solutions (proper XML schema resolution) mentioned here which requires me to enable Spring project nature in an existing project in STS 4. According to this, there would be a Spring Tools context menu on which one can do “Spring Tools -> Add Spring Project Nature”. I'm not seeing that menu:
My .project file has the following already:
<natures>
<nature>org.springframework.ide.eclipse.core.springnature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
What am I missing?
Update:
As per Martin's second comment, the following works:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-jdbc="http://www.springframework.org/schema/integration/jdbc"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-5.0.xsd
http://www.springframework.org/schema/integration/jdbc http://www.springframework.org/schema/integration/jdbc/spring-integration-jdbc.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
The Spring Nature feature that you are referring to doesn't exist anymore in the STS4 public beta that you seem to use. Therefore there is no "Spring" section in the context-menu anymore that offers the Spring Nature. It is not simply not needed anymore in STS4.
The question here is: What exactly are you trying to do in STS4 that doesn't work? If something is strange and missing in STS4 that you would like to see it getting back from STS3, you should raise an issue at https://github.com/spring-projects/sts4/issues and attach a sample project that reproduces the underlying issue. I would be happy to take a more detailed look then.
As a workaround, you can go back and download the latest STS 3.9.2 distribution and work from there, it still has all the old features included.

Register groovy bean in spring java config

I have this xml config
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">
<lang:groovy id="foo" script-source="${groovyBeanLocation}"/>
</beans>
I imported this config in my ApplicationConfig, but do not want to mix several types of configurations (java and xml).
How can I make a given configuration using java?
If you're using a Groovy class as a Spring bean, you don't need the <lang:groovy> tag at all. Just deploy your compiled class as though it was Java, and it should just work as long as you include the groovy-all jar file as a project dependency.
The <lang:groovy> tag with a script-source is for "refreshable" beans. That's where you deploy the source code (rather than the compiled version), and Spring detects changes and recompiles for you. It's how you can update code in a running application, which is cool but pretty rare.
If all you want to do is write your implementation classes in Groovy, just compile them as usual and add them to the JavaConfig files the way you would any other bean. It's all bytecodes to Spring.

Spring At least one base package must be specified exception

When I'm compiling my project it gives this error and stop compiling
org.springframework.beans.factory.BeanDefinitionStoreException:
Unexpected exception parsing XML document from ServletContext resource
[/WEB-INF/application-context.xml]; nested exception is
java.lang.IllegalArgumentException: At least one base package must be
specified
Why this exception happen and How I solve it.
As per Spring Doc
Spring provides the capability of automatically detecting 'stereotyped' classes and registering corresponding BeanDefinitions with the ApplicationContext. To autodetect these classes and register the corresponding beans requires the inclusion of the following element in XML where 'basePackage' would be a common parent package for the two classes (or alternatively a comma-separated list could be specified that included the parent package of each class).
Hence your application-context should look something like this:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="org.example"/>
</beans>
to enable your package to get scanned via component-scan you should annotate your java class with respective annotation as per the requirement. Like #Controllers or #Service etc.
See the full details here.
<context:component-scan base-package="Your package">
</context:component-scan>
try adding this in you configuration file
From my comments above
The reason could be you have annotation driven context configuration enabled (<context:annotation-config></context:annotation-config>) in you application context, but you have to provided any base package to scan for spring beans.
Add the root package of your application as the base package to scan for bean definitions
<context:component-scan base-package="<your-app-base-package>"/>

How to figure out which jars are needed?

How can I systematically determine which jars I'll need, and thus should include in my pom.xml file (I'm using maven as my project management tool)?
When learning spring, to keep things simple, added all the jars (even the ones I never used) to the classpath.
Right now for the most part, I'm guessing which jars to include. For example, I know in my spring configuration file, I have:
<tx:annotation-driven />
<context:annotation-config />
<aop:aspectj-autoproxy />
So, I guess I'll need: spring-context-x.x.x.jar, spring-tx-x.x.x.jar, spring-aop-x.x.x.jar
Thanks.
For the general problem of finding which JAR(s) contain which classes and their associated dependencies, you can try http://www.jarvana.com/jarvana/. It takes a class name as input and spits out a bunch of Maven dependencies you can use to get said class.
For Spring in particular, I believe you'll have to refer to its documentation. If you have IDE support for Maven, you can typically simply fill in the spring groupId (org.springframework) and activate autocompletion inside <artifactId></artifactId> to see which JARs are available. The main sections in the Spring docs tend to have their own separate jars.
As I'm sure you've seen, another good indicator that you'll need a separate JAR are the XML namespaces used in your applicationContext.xml file. For example, here's an XML root node from a project using aop, tx and beans:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
default-autowire="byName">
The example above would imply that you need the spring-beans, spring-aop and spring-tx JARs (Spring's JAR naming is fairly consistent). I'm not sure if the above is always true, but it should at least give you an indication.
I see only two possible alternatives. Either:
"know what you're doing" and add the required dependencies before the fact ~or~
In doubt, don't add the dependency, let things fail and add the dependency after the fact
An easy way to completely forget about the JAR files is to use nexus.
If you're a corporation, you can set up your own Nexus server. If not, use a public server such as http://repository.sonatype.org (note: I haven't used this yet as we have our own) and search for the library.
Once you found the library, copy/paste the <dependency> ... </dependency> section into your POM file and you're good to go.
I forgot how we linked maven with the nexus server, but it's not too hard.. do a bit of searching and you're golden. No more worrying about JAR files!

Categories

Resources