struts2 spring json报JSONException

本文介绍在Spring配置文件中定义Bean并使用Struts2进行JSON转换时遇到的问题及解决方案。当Bean包含不需要转换为JSON的属性时,如何通过注解避免JSONException异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于spring配置文件中定义的bean,在java代码中含有get方法而且struts中使用了json返回,而这个bean在转json中不用转成json,需要在它的get方法上加@JSON(serialize=false),或者把get方法删除。否则会报org.apache.struts2.json.JSONException。


比如applicationContext.xml中有一个bean中含有jdbcTemplate属性,而example.TestAjax类中转json中不用转jdbcTemplate属性,则要在getJdbcTemplate()方法上加注解@JSON(serialize=false),而属性s在类中不是bean的定义类型,则正常,下面执行结果中返回的object中包含了list和s,虽然s没有特意转成json。返回的object含有类中所有get方法返回的内容

<bean id="a" class="example.TestAjax">
	<property name="jdbcTemplate" ref="jdbcTemplate" />
	<property name="s" value="test"/>
</bean>

example.TestAjax
package example;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import org.apache.struts2.json.annotations.JSON;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.opensymphony.xwork2.ActionSupport;


public class TestAjax extends ActionSupport{
	
	private static final long serialVersionUID = 1L;
	private String result;
	private JdbcTemplate jdbcTemplate;
	private String s;
	
	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

	public String ajaxMap(){
        Map<String, String> map = new HashMap<String, String>();  
        map.put("name", "Name");  
        JSONObject json = JSONObject.fromObject(map); 
		result = json.toString();
		return SUCCESS;
	}
	
	public String ajaxList() throws JsonGenerationException, JsonMappingException, IOException{
		String sql = "select * from user;";
		final List<User> list = new ArrayList<User>();
		jdbcTemplate.query(sql, new RowCallbackHandler(){
			@Override
			public void processRow(ResultSet arg0) throws SQLException {
				User u = new User(); 
				u.setName(arg0.getString("User"));
				u.setPassword(arg0.getString("Password"));
				list.add(u);
			}
		});
//		JSONObject obj = JSONObject.fromObject(l);
		//jackson
		ObjectMapper o = new ObjectMapper();
//		result = o.writeValueAsString(l);
		result = o.writeValueAsString(list);
		return SUCCESS;
	}
	
	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}
	
	// @JSON(serialize=false)不能少,不然返回json时会报错
	@JSON(serialize=false)
	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	//User要加public不然上面的转json会提示找不到set方法
	public class User{
		private String name;
		private String password;
		
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
	}
}



控制台输出Object{ result="[{"name":"root","passwo...FE62151AE967ECA5E0AA"}]",s="test"}

计算机网络期末复习题 201708-201801计算机网络复习指导发布-校考学生!!下载截止于12.5日晚上9点 2017-12-04 23:07 计算机网络复习指导-校内考试 §1.名词解释: 1. 计算机网络 2.网络体系结构 3.高速以太网 4.静态路由选择 5. 动态路由选择 6.子网掩码 8.动态主机配置协议 9.套接字 10.客户/服务器模型(C/S模型) 11.域名系统(DNS) 12.光纤分布式数据接口FDDI §2.简答题: 1.试谈你对网络安全的威胁和防病毒技术的认识。(线下教学课件) 2.简述物理层的四个特性。(线下教学课件) 3.计算机网络的组成(P2-P3) 4.计算机网络的功能(P3) 5.计算机网络标准化的相关组织(P4+线下教学课件) 6.计算机网络的性能指标(P8+线下教学课件) 7.简述你所知道的网络传输介质(P33-34) 8.物理层的四个特性(P34) 9.简述四种帧边界的划分方法(即组帧方法)。(P52-54+线下教学课件) 10.简述停止-等待流量控制(协议)。(P59+P62-P64+线下教学课件) 11.简述时分多路复用(P69+线下教学课件) 12.简述频分多路复用(P68+线下教学课件) 13.简述IPv4地址的分类(P122-123) 14.UDP数据与IP分组的区别(P187) §3.论述题: 1.试说明数据链路层原语和协议的转换。(线下教学课件) 2.描述常规释放的过程,并画出其示意图。(线下教学课件) 3.奈奎斯特定理公式和香农定理公式的主要区别是什么? 4.试比较电路交换、文交换和分组交换等三种数据传输方式。(P27-29) 5.谈谈你对差错控制方法的理解。(P54-58+线下教学课件) 6.谈谈域名解析过程(P225-226) 7.ARP和DNS是否有些相似?它们有何区别?(P227) 8.FTP的工作原理。(P228)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值