问题
I am trying to convert a static xml into a POJO (unmarshalling) in my controller class. I am using Jaxb2Marshaller and I am configuring in the following way in my root context
<oxm:jaxb2-marshaller id="marshaller">
<oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Airport"/>
</oxm:jaxb2-marshaller>
I am trying to inject the marshaller using autowiring. But it throws No Bean Found Exception.
@AutoWired
private Unmarshaller marshaller;
How to inject the marshaller in the controller. Any other ways or pointing out the error in my code will be helpful?
回答1:
Spring context configuration
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xmlns:automation="http://www.springframework.org/schema/automation"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:oxm="http://www.springframework.org/schema/oxm"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/automation
http://www.springframework.org/schema/automation/automation.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/oxm
http://www.springframework.org/schema/oxm/spring-oxm.xsd">
<context:annotation-config/>
<oxm:jaxb2-marshaller id="jaxb2Marshaller">
<oxm:class-to-be-bound name="your.package.Prova" />
</oxm:jaxb2-marshaller>
</beans>
Class
@AutoWired
private org.springframework.oxm.Unmarshaller jaxb2Marshaller;
回答2:
I faced a similar issue recently, and I believe the solution I come up is different from the accepted answer, which I think it worth to raise it for reference.
Let me make sure my understanding on your situation is right:
In dispatcher-context, you have:
- created the jaxb2 marshaller
- created the controllers.
- in one of the controller, you tried to inject the marshaller (through annotation)
However the injection failed. And when move the creation of JAXB2 Marshaller to the root context, it works.
If my description of your situation is right, then keep on reading:
What you have done is in fact correct: JAXB2 Marshaller and the Controller beans are created in the same context (the dispatcher-context) and Controller bean should be able to be injected with the marshaller bean.
The problem is possibly in the root context, you have created another controller bean. And it is that extra controller bean in root context cannot be injected with the marshaller (because marshaller bean exists in a child context which cannot be accessed). Therefore when you move the marshaller bean to root context, everything seems work (because both Controller in root context and dispatcher context can see the marshaller bean)
The common problem is in your root context xml, you have component-scan
declared. By default, component-scan
will include classes annotated with @Controller
during its scan. This bring another controller bean in your root context.
If it is the case, solution is straight-forward: simply exclude Controller in root context component scan (and include only Controller in dispatcher context component scan)
root context xml:
<context:component-scan base-package="com.foo">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
dispatcher context xml:
<context:component-scan base-package="com.foo" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
来源:https://stackoverflow.com/questions/25807872/injecting-jaxb2marshaller-in-spring-mvc-controller