SpringMVC使用jaxb2实现bean与xml的互相转换出错!

黄代松 发布于 2014/07/02 19:15
阅读 4K+
收藏 0

当返回的是一个User对象时,前台可以正常显示xml

但当返回一个List<User>时,就出现一下错误:

HTTP Status 500 - Unable to locate object to be marshalled in model: {userList=[User [user_id=1, account=null, password=pwd0, name=jack_0], User [user_id=2, account=null, password=pwd1, name=jack_1], User [user_id=3, account=null, password=pwd2, name=jack_2]}

其中,springmvc-servlet.xml对应的配置是:

<!-- 视图解析器(ViewResolver) -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" >
	<property name="order" value="1" />
	
    <!-- 设置为true以忽略对Accept Header的支持--> 
    <property name="ignoreAcceptHeader" value="true"/>
    
    <!-- 用于关闭 /userinfo/123.json 的支持 默认是true -->
    <property name="favorPathExtension" value="true"/>  
    
    <!-- 用于开启 /userinfo/123?format=json 的支持 -->  
    <property name="favorParameter" value="false"/>  
    
    <property name="parameterName" value="format"/>
    
    <!-- 在没有扩展名时即: "/user/1" 时的默认展现形式 -->
    <property name="defaultContentType" value="text/html"/>
    
    <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
    <property name="mediaTypes">
        <map>
            <entry key="html" value="text/html" />
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>

    <property name="viewResolvers">
        <list>
        	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
        	
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
                <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
				<!-- 前缀+viewname+后缀     就是访问路径 -->
				<!-- 前缀(从WebRoot目录向下) -->
				<property name="prefix" value="/WEB-INF/views/"></property>
				<!-- 后缀 ,可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑  -->
				<property name="suffix" value=".jsp"></property>
            </bean>
			<!-- 可加入其他视图技术如 volacity jstl等 -->
          </list>
      </property>

	<!-- view 接口 下的视图解析对象 -->  
    <property name="defaultViews">
        <list>
            <!-- 输出为JSON数据-->
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" ></bean>
           
            <!-- 输出为xml数据-->
            <bean name="jaxb2MarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
			<constructor-arg>
				<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
					<property name="classesToBeBound">
						<list>  
							<value>com.session.vo.User</value>
						</list>
					</property>
				</bean>
			</constructor-arg>
		</bean>
        </list>
    </property>
</bean>



对应的Controller是:

@RequestMapping("/xml3")
    public ModelAndView xml3(Model model) {  
        System.out.println("Jaxb2-XML-json");
        ModelAndView mav = new ModelAndView("xml");
	    List<User> list = new ArrayList<User>();

	    for (int i = 0; i < 5; i++) {
	    	User user = new User();
	    	user.setUser_id(1 + i);
			user.setPassword("pwd" + i);
			user.setName("jack_" + i);
			list.add(user);
		}
	    mav.addObject("userList", list);

	    return mav;
    }



User对象:
@XmlRootElement(name = "user")
public class User{

	private int user_id;
	private String password;
	private String name;

	@XmlElement
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
....略....
}



求大神指出问题所在,感激不尽!
加载中
0
黄代松
黄代松
求大神帮忙 感激不尽
0
char1st
char1st

不能直接在User上用jaxb,因为你添加到ModelAndView里面的其实是个List。 你要把你那些user封装成自己的UserList。之后再用jaxb.

http://stackoverflow.com/questions/15273393/javax-servlet-servletexception-unable-to-locate-object-to-be-marshalled-in-mode

黄代松
黄代松
非常感谢,已经顺利解决问题
0
高明华
高明华

不能直接返回List,需要套一层。因为XML需要指定XmlRootElement(包括List)

@XmlRootElement(name="UserList")
public class UserList {
	private List<User> userList;
	
	...

	@XmlElement(name="Message")
	public List<Message> getMessageList() {
		return messageList;
	}
}



黄代松
黄代松
非常感谢你的回答,我已经顺利解决问题啦 二楼比你回答的快一点,所以就采纳他了 还是非常的感谢哦
返回顶部
顶部