Injecting Jaxb2Marshaller in Spring MVC controller

拜拜、爱过 提交于 2019-12-10 16:16:47

问题


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:

  1. created the jaxb2 marshaller
  2. created the controllers.
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!