Permalink
Browse files

Fix FieldSerializer, do not try to serialize non existent fields or s…

…tatic fields
  • Loading branch information...
1 parent 78f1737 commit ed0a9488c4163455980047c20e409ac810a32e2e Joni Freeman committed Apr 13, 2011
@@ -78,7 +78,8 @@ object Extraction {
case x if (x.getClass.isArray) => JArray(x.asInstanceOf[Array[_]].toList map decompose)
case x: Option[_] => x.flatMap[JValue] { y => Some(decompose(y)) }.getOrElse(JNothing)
case x =>
- primaryConstructorArgs(x.getClass).map { case (name, _, _) =>
+ val constructorArgs = primaryConstructorArgs(x.getClass)
+ constructorArgs.collect { case (name, _, _) if Reflection.hasDeclaredField(x.getClass, name) =>
val f = x.getClass.getDeclaredField(name)
f.setAccessible(true)
JField(unmangleName(name), decompose(f get x))
@@ -253,6 +253,7 @@ private[json] object Meta {
def fields(clazz: Class[_]): List[(String, TypeInfo)] = {
val fs = clazz.getDeclaredFields.toList
+ .filterNot(f => Modifier.isStatic(f.getModifiers))
.map(f => (f.getName, TypeInfo(f.getType, f.getGenericType match {
case p: ParameterizedType => Some(p)
case _ => None
@@ -280,6 +281,13 @@ private[json] object Meta {
else findField(clazz.getSuperclass, name)
}
+ def hasDeclaredField(clazz: Class[_], name: String): Boolean = try {
+ clazz.getDeclaredField(name)
+ true
+ } catch {
+ case e: NoSuchFieldException => false
+ }
+
def mkJavaArray(x: Any, componentType: Class[_]) = {
val arr = x.asInstanceOf[scala.Array[_]]
val a = java.lang.reflect.Array.newInstance(componentType, arr.size)
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2009-2011 WorldWide Conferencing, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.liftweb
+package json
+
+import org.specs.Specification
+
+object FieldSerializerBugs extends Specification {
+ import Serialization.{read, write => swrite}
+
+ implicit val formats = DefaultFormats + FieldSerializer[AnyRef]()
+
+ "AtomicInteger should not cause stack overflow" in {
+ import java.util.concurrent.atomic.AtomicInteger
+
+ val ser = swrite(new AtomicInteger(1))
+ val atomic = read[AtomicInteger](ser)
+ atomic.get mustEqual 1
+ }
+}
+

0 comments on commit ed0a948

Please sign in to comment.