[rules-users] How to declare an array attribute within an object in a DRL file?

fulton fulton.gee at LMCO.com
Wed Apr 27 17:06:15 EDT 2011


Wolfgang,

Thanks again for the reply!  However, after much testing, I'm still having
problems with Drools Server parsing the JSON array.  My current test DRL is:

==============================
package  com.foobar

declare Person
	name: String
	hobbies: java.util.ArrayList
end

rule "Person" dialect "mvel"

when
    $p : Person();
then
    $p.name = $p.name + " has hobby size of " + $p.hobbies.size();
end
===============================

and my current JSON msg sent to the Drools Server (via TCPMON) is:

===============================
{
	'insert':
	{
		'out-identifier': '123',
		'object':
		{
			'com.foobar.Person':
			{
				"name":"fulton",
				"hobbies":
				[123]
			}
		}
	}
}
==============================

The above JSON will be inserted successfully, but the result shows that
$p.hobbies.size() returns "0".  If I add another element to the JSON array
(e.g., [123,345]), I get the following Xstream exception:

==============================
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException:
hobbies
---- Debugging information ----
duplicate-field     : hobbies
class               : org.drools.command.runtime.rule.InsertObjectCommand
required-type       : com.foobar.Person
line number         : -1
-------------------------------
	at
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$SeenFields.add(AbstractReflectionConverter.java:322)
	at
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:234)
===============================

If I modify the JSON array to contain objects (e.g.,
[{"abc":"123"},{"cdf":"345"}]), which is what I'm ultimately desiring, then
I get the following exception:

===============================
com.thoughtworks.xstream.converters.ConversionException: 123 : 123 : 123 :
123
---- Debugging information ----
message             : 123 : 123
cause-exception     :
com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : 123 : 123
class               : org.drools.command.runtime.rule.InsertObjectCommand
required-type       : java.util.ArrayList
line number         : -1
-------------------------------
	at
com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	at
com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
===============================

Am I missing something in the DRL declaration?  Do the array elements need
to be declared somehow (if so, how?)?  Can Xstream unmarshal the JSON array
into an ArrayList?

I can move this thread to the Xstream forum (if there is one), if you'd
like, but if there's a simple answer here, then I'd greatly appreciate it!

Thanks again for your help!

--
View this message in context: http://drools.46999.n3.nabble.com/How-to-declare-an-array-attribute-within-an-object-in-a-DRL-file-tp2867666p2872022.html
Sent from the Drools: User forum mailing list archive at Nabble.com.



More information about the rules-users mailing list