NutzCN Logo
问答 nutz-json报错
发布于 2906天前 作者 qq_6c186ef5 4709 次浏览 复制 上一个帖子 下一个帖子
标签: 建议 json
java.lang.StackOverflowError
	at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:58)
	at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:392)
	at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:447)
	at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
	at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:94)
	at java.io.OutputStreamWriter.write(OutputStreamWriter.java:177)
	at org.apache.tomcat.util.buf.C2BConverter.convert(C2BConverter.java:99)
	at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:425)
	at org.apache.catalina.connector.CoyoteWriter.write(CoyoteWriter.java:129)
	at java.io.PrintWriter.append(PrintWriter.java:1019)
	at java.io.PrintWriter.append(PrintWriter.java:35)
	at org.nutz.json.impl.JsonRenderImpl.string2Json(JsonRenderImpl.java:334)
	at org.nutz.json.impl.JsonRenderImpl.appendName(JsonRenderImpl.java:146)
	at org.nutz.json.impl.JsonRenderImpl.appendPair(JsonRenderImpl.java:165)
	at org.nutz.json.impl.JsonRenderImpl.writeItem(JsonRenderImpl.java:313)
	at org.nutz.json.impl.JsonRenderImpl.map2Json(JsonRenderImpl.java:221)
	at org.nutz.json.impl.JsonRenderImpl.render(JsonRenderImpl.java:115)
	at org.nutz.json.impl.JsonRenderImpl.appendPair(JsonRenderImpl.java:167)
	at org.nutz.json.impl.JsonRenderImpl.writeItem(JsonRenderImpl.java:313)
	at org.nutz.json.impl.JsonRenderImpl.pojo2Json(JsonRenderImpl.java:306)
	at org.nutz.json.impl.JsonRenderImpl.render(JsonRenderImpl.java:128)
List<Object> dataList = new ArrayList<Object>();
									dataList.add(user);
									dataList.add(us);

将这个list转成json的时候就出错了...

24 回复

user和us分别是什么,给出完整代码嘛

user为用户实体对象,添加成功之后吧用户信息返回,us也是一个对象UsersregSubscriber us = new UsersregSubscriber(map2);消息对象,就是订阅消息后收到的消息对象(即我分装mq的subscribe对象),

public class UsersregSubscriber {
	
	private Map<String,Object> map2;
	
	public UsersregSubscriber(){
		map2 = new HashMap<String, Object>();
	}
	public UsersregSubscriber(Map<String,Object> map2){
		if(map2!=null && map2.size()>0)
			RemoveMapKey.removeKeys(map2);
		this.map2 = map2;
	}
	
	public void subscriber(){
		ConnectionFactory cf = ConnectUtil.getConnFactory();
		
		final Connection conn;
		try {
			ConnectUtil.setSubject(null);
			conn = cf.createConnection();
			conn.start();
			final Session session = conn.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
			Topic topic = session.createTopic(ConnectUtil.getSubject());
			MessageConsumer consumer = session.createConsumer(topic);
			consumer.setMessageListener(new MessageListener() {
				
				public void onMessage(Message msg) {
					
					MapMessage mapMsg = (MapMessage) msg;
					try {
						map2.put("state", mapMsg.getString("rows"));
						map2.put("desc", mapMsg.getString("desc"));
						UsersregSubscriber us = new UsersregSubscriber();
						us.setMap2(map2);
						System.out.println("订阅者:"+mapMsg.getString("desc"));
						session.commit();
					} catch (JMSException e) {
						e.printStackTrace();
					}finally{
						new FlushResource(conn, session).closeNoMapMsg();
					}
				}
			});
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void setMap2(Map<String, Object> map2) {
		this.map2 = map2;
	}
	
	public Map<String, Object> getMap2() {
		return map2;
	}
	
}

去掉其中一行,看看到底是哪行导致的.

dataList.add(user);
dataList.add(us);

第二行导致的,

那个第二个对象us我改如何处理才能以json的形式返回给ajax请求

打印一下每个key及value的类型看看, 感觉是混入了某些特殊的对象.

for (Map.Entry<String, Object> en : us.getMap2().entrySet()) {
    System.out.println(en.getKey());
    System.out.println(en.getValue().getClass());
}

这个map对象只是被new之后的一个map实例,没有任何值,是不是因为这个map没有东西导致的

@qq_6c186ef5 没懂, dataList.add前后的代码都发一下

public Messages usersRegister(HttpServletRequest req){
		Messages msg = new Messages();
		RemoveMapKey.removeKeys(map);
		RemoveMapKey.removeKeys(map2);
		try{
			Map<String, Object> params = DyCreateBean.getQueryParams(req);
			Object[] obj = IsNullPojo.getIsNullPojo(klass);//获取允许为null的字段
			//获取实体的所有字段
			Map<String[], Field[]> poJo = DyCreateBean.reflactPoJo(klass);
			if(params!=null && params.size()>0){
				List<Object> list = DyCreateBean.checkParamIsNulls(klass, params, poJo, obj);
				if(list!=null && list.size()>0){
					List<String> notNullParam = (List<String>) list.get(0);
					if(notNullParam==null || notNullParam.size()<=0){
						Users user = (Users) list.get(1);
						if(user!=null){
							InitValue init = new InitValue();
							user = (Users) init.initAllowNull(poJo, IsNullPojo.getIsNullPojomap(klass), params, user);
							if(user!=null){
								user.setCode(RisunAppid.getAppID(16));
								int addOne = userDao.addOne(user);
								if(addOne>0){
									//用户注册成功之后就提交消息订阅
									UsersregSubscriber us = new UsersregSubscriber(map2);
									us.subscriber();
									List<Object> dataList = new ArrayList<Object>();
									dataList.add(user);
									//dataList.add(us);
//									map2.put("user", user);
//									map2.put("subscriber", us);
									for (Map.Entry<String, Object> en : us.getMap2().entrySet()) {
									    System.out.println(en.getKey());
									    System.out.println(en.getValue().getClass());
									}
									map = CheckSignRSA.returnSuccData(map, map2, dataList);
									//map = CheckSignRSA.returnSuccData4(map, map2,"用户注册成功");
								}else{
									map = CheckSignRSA.returnSuccData3(map, map2,"用户注册失败");
								}
							}
						}else{
							map = CheckSignRSA.returnSuccData3(map, map2,"数据不存在");
						}
					}else {
						map = CheckSignRSA.returnSuccData3(map, map2,"请输入完整的数据,不允许有空值");
					}
				}else {
					map = CheckSignRSA.returnSuccData3(map, map2,"请检查参数是否符合要求");
				}
			}else {
				map = CheckSignRSA.returnSuccData3(map, map2,"参数错误,请联系管理员");
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		msg.setMsg(Json.toJson(map));
		return msg;
	}

这一句??

msg.setMsg(Json.toJson(map));

没看到 dataList 被toJson的地方

map = CheckSignRSA.returnSuccData(map, map2, dataList);
msg.setMsg(Json.toJson(map));

这样学了之后,是不是nutz会自动把msg对象再装成json呢?

我是把所需要的所有数据全部放置到map中,再把map转成json,然后返回数据.

returnSuccData的代码贴出来看看

就下面这几行

map.put(ConstValues.STR_STATE, ConstValues.DATA_SUCC);
		map.put(ConstValues.STR_DES, ConstValues.GET_API_SUCCESS);
		if(list==null||list.size()==0){
			map2.put(ConstValues.STR_STATUS, ConstValues.DATA_NONE);
			map2.put(ConstValues.STR_DES, ConstValues.GET_DATA_EMPTY);
		}else{
			map2.put(ConstValues.STR_STATUS, ConstValues.DATA_SUCC);
			map2.put(ConstValues.STR_DATA, list);
			map2.put(ConstValues.STR_DES, ConstValues.GET_DATA_SUCCESS);
		}
		map.put("cont", map2);
		return map;

那dataList没有用上啊?

这句??

map2.put(ConstValues.STR_DATA, list);

map = CheckSignRSA.returnSuccData(map, map2, dataList);
map2.put(ConstValues.STR_DATA, list);这个中的list就是传进来的dataList

public static Map<String, Object> returnSuccData(Map<String, Object> map,Map<String, Object> map2,List<Object> list){
		map.put(ConstValues.STR_STATE, ConstValues.DATA_SUCC);
		map.put(ConstValues.STR_DES, ConstValues.GET_API_SUCCESS);
		if(list==null||list.size()==0){
			map2.put(ConstValues.STR_STATUS, ConstValues.DATA_NONE);
			map2.put(ConstValues.STR_DES, ConstValues.GET_DATA_EMPTY);
		}else{
			map2.put(ConstValues.STR_STATUS, ConstValues.DATA_SUCC);
			map2.put(ConstValues.STR_DATA, list);
			map2.put(ConstValues.STR_DES, ConstValues.GET_DATA_SUCCESS);
		}
		map.put("cont", map2);
		return map;
	}

引用关系有点乱

map --> map2
map --> list(dataList)
us --> map2
list(dataList) -> us
UsersregSubscriber us = new UsersregSubscriber(map2);

改成下面这样试试

UsersregSubscriber us = new UsersregSubscriber();

知道了, 这一句

map2.put("subscriber", us);

us本来就引用了map2,然后map2又引用us

看来是JsonRenderImpl没考虑到这种循环引用的情况

好,我知道该怎么处理了,感谢兽总,那兽总,这个问题啥时能优化下呢,期待json新版本...

添加回复
请先登陆
回到顶部