首先说明出现的原因:json这个东西不够智能,在解析javabean对象中的getter和setter方法时,会把两个方法命名十分相近的方法当成一个。从而形成异常。
解决办法:重新命名方法名。
同时需要注意:json在写入某一个meta对象时,会将其所关联的meta对象统统捋一遍(不一定是重置,可能仅仅是遍历一下)。
这是我们的json写入异常:
com.cutt.zhiyue.android.api.io.exception.JsonFormaterException: com.fasterxml.jackson.databind.JsonMappingException: Conflicting getter definitions for property "groupWanted": com.cutt.zhiyue.android.model.meta.order.OrderProductMeta#isGroupWanted(0 params) vs com.cutt.zhiyue.android.model.meta.order.OrderProductMeta#getGroupWanted(0 params) (through reference chain: com.cutt.zhiyue.android.model.meta.card.CardMetaAtom["article"]->com.cutt.zhiyue.android.model.meta.article.Article["creator"]->com.cutt.zhiyue.android.api.model.meta.UserInfo["product"]->java.util.ArrayList[0])
引起异常的部分代码:
1 public int getGroupWanted() { 2 return groupWanted; 3 } 4 5 public void setGroupWanted(int groupWanted) { 6 this.groupWanted = groupWanted; 7 } 8 9 public boolean isGroupWanted() { 10 return groupWanted == 1; 11 }
getGroupWanted()和isGroupWanted()是不是很像?
发现:
今天测试提了一个bug:由a页跳转到b页,在b页跳转到c页,c页再回到b页时,b页直接销毁了,并且回到了a页。
经过debug后发现:b页中的onCreate()方法中上来就是:
1 super.onCreate(savedInstanceState); 2 if(curAtom == null){ 3 notice(R.string.error_article_data); 4 return; 5 }
而引起b页直接销毁的,就是这个curAtom== null。可见curAtom这个变量一定是在父类中初始化的。我们又跳到父类中去查看发现在onCreate()方法中:
makeAtom(savedInstanceState,intent);
1 private void makeAtom(Bundle savedInstanceState, Intent intent) { 2 if (savedInstanceState != null) { 3 String atom = savedInstanceState.getString(BOUNDLE_ATOM); 4 try { 5 curAtom = JsonParser.getValue(JsonObjectMapper.getObjectMapper(), atom, CardMetaAtom.class); 6 } catch (DataParserException e) { 7 e.printStackTrace(); 8 curAtom = ArticleActivityFactory.getInputAtom(intent); 9 } 10 } else { 11 curAtom = ArticleActivityFactory.getInputAtom(intent); 12 } 13 }
这个方法很简单,我就不解释了。经过debug发现savedInstanceState虽然不为空,但从里面取不到值。那我们就需要看看为什么它取不到值,是不是根本就没存上。
于是来到onSaveInstanceState()方法。
1 @Override 2 protected void onSaveInstanceState(Bundle outState) { 3 try { 4 String atom = JsonWriter.writeValue(curAtom); 5 outState.putString(BOUNDLE_ATOM, atom); 6 } catch (JsonFormaterException e) { 7 e.printStackTrace(); 8 } 9 super.onSaveInstanceState(outState); 10 }
还是经过debug发现curAtom这个变量根本没有写上,原因就是文章开篇报的那个json异常。