[mule-user] Question about JMSMessageToObject for Object

1 view
Skip to first unread message

paven

unread,
May 21, 2008, 7:18:03 AM5/21/08
to us...@mule.codehaus.org

Hi,

I've transformed my payload (a javabean) to a JMSMessage with
ObjectToJMSMessage (No complaints) and when I try to transform it back with
JMSMessageToObject it complains that the object transformed is of type
(testClass) and expected returntype is String. From what I could gather the
transformers would handle Objects and since testClass IS-A Object I'm not
sure if I've misunderstood this. Should this work? Or is the only way to
transform it to do custom transformers?

Best Regards
Mattias
--
View this message in context: http://www.nabble.com/Question-about-JMSMessageToObject-for-Object-tp17364133p17364133.html
Sent from the Mule - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

http://xircles.codehaus.org/manage_email


Ove Gram Nipen

unread,
May 21, 2008, 7:36:42 AM5/21/08
to us...@mule.codehaus.org
On Wed, 2008-05-21 at 04:18 -0700, paven wrote:
> Hi,
>
> I've transformed my payload (a javabean) to a JMSMessage with
> ObjectToJMSMessage (No complaints) and when I try to transform it back with
> JMSMessageToObject it complains that the object transformed is of type
> (testClass) and expected returntype is String. From what I could gather the
> transformers would handle Objects and since testClass IS-A Object I'm not
> sure if I've misunderstood this. Should this work? Or is the only way to
> transform it to do custom transformers?

It sounds a bit like the transformation from JMSMessage to an Object has
already taken place before your transformer is called. Can I see your
config, please?

--
Regards,
Ove Gram Nipen

paven

unread,
May 28, 2008, 8:11:19 AM5/28/08
to us...@mule.codehaus.org

Ove Gram Nipen wrote:
>
>
> It sounds a bit like the transformation from JMSMessage to an Object has
> already taken place before your transformer is called. Can I see your
> config, please?
>

I have put in two different examples, and the placement of the echocomponent
seems to be the cause.
If this is the case, is there a way to manipulate the contents I get off of
jms before getting it to the component w/o having to add another service?

Best Regards,
Mattias
-------------------------
Here is the full config:
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:jdbc="http://www.mulesource.org/schema/mule/jdbc/2.0"
xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.0"
xmlns:soap="http://www.mulesource.org/schema/mule/soap/2.0"
xmlns:axis="http://www.mulesource.org/schema/mule/axis/2.0"
xmlns:xm="http://www.mulesource.org/schema/mule/xml/2.0"
xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.0"
xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.0"


xsi:schemaLocation="
http://www.mulesource.org/schema/mule/core/2.0
http://www.mulesource.org/schema/mule/core/2.0/mule.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.mulesource.org/schema/mule/jdbc/2.0
http://www.mulesource.org/schema/mule/jdbc/2.0/mule-jdbc.xsd
http://www.mulesource.org/schema/mule/stdio/2.0
http://www.mulesource.org/schema/mule/stdio/2.0/mule-stdio.xsd
http://www.mulesource.org/schema/mule/soap/2.0
http://www.mulesource.org/schema/mule/soap/2.0/mule-soap.xsd
http://www.mulesource.org/schema/mule/axis/2.0
http://www.mulesource.org/schema/mule/axis/2.0/mule-axis.xsd
http://www.mulesource.org/schema/mule/xml/2.0
http://www.mulesource.org/schema/mule/xml/2.0/mule-xml.xsd
http://www.mulesource.org/schema/mule/jms/2.0
http://www.mulesource.org/schema/mule/jms/2.0/mule-jms.xsd
http://www.mulesource.org/schema/mule/vm/2.0
http://www.mulesource.org/schema/mule/vm/2.0/mule-vm.xsd">

<object-to-string-transformer name="ObjectToString"/>
<jms:object-to-jmsmessage-transformer name="ObjectToJMS" />
<jms:jmsmessage-to-object-transformer name="JMSToObject" />
<custom-transformer name="TTRequestToString"
class="org.myorg.bonding.TTRequestToString"/>
<custom-transformer name="MapToTTRequest"
class="org.myorg.bonding.MapToTTRequest"/>


<spring:bean id="clarify"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<spring:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<spring:property name="url" value="jdbc:mysql://localhost:3306/test"/>
<spring:property name="username" value="root"/>
<spring:property name="password" value="testPWD"/>
</spring:bean>

<jdbc:connector name="jdbcConnector" dataSource-ref="clDB"
pollingFrequency="6000">
<jdbc:query key="getz" value="SELECT * FROM z_db WHERE isnull(STATUS)"/>
<jdbc:query key="getz.ack" value="UPDATE z_db SET STATUS = 'test' WHERE
ID = ${map:ID}"/>
</jdbc:connector>
<endpoint name="jdbcEndpointGetZ" address="jdbc://getz"/>

<jms:activemq-connector name="jmsConnector" />
<endpoint name="jmsTest" address="jms://esb.test.jms" />

<!-- Working example-->

<model name="jdbcSample">
<service name="JDBC">
<inbound>
<stdio:inbound-endpoint system="IN"/>
<inbound-endpoint ref="jdbcEndpointGetZ"/>
<forwarding-router/>
</inbound>
<outbound>
<outbound-pass-through-router>
<outbound-endpoint ref="jmsTest" transformer-refs="MapToTTRequest
ObjectToJMS"/>
</outbound-pass-through-router>
</outbound>
</service>

<service name="JMS">
<inbound>
<inbound-endpoint ref="jmsTest" transformer-refs="JMSToObject"/>
<!-- If i add a custom transformer for TTRequestToString here it does the
job, but in the below non-working example it doesn't-->

<forwarding-router/>
</inbound>
<outbound>
<outbound-pass-through-router>
<vm:outbound-endpoint path="echoUMO"/>
</outbound-pass-through-router>
</outbound>
</service>

<service name="Echo">
<inbound>
<vm:inbound-endpoint path="echoUMO"/>
</inbound>
<echo-component/>
<outbound>
<outbound-pass-through-router>
<stdio:outbound-endpoint system="OUT" />
</outbound-pass-through-router>
</outbound>
</service>
</model>
<!-- End Working example-->

<!-- Not working example
<model name="jdbcSample">
<service name="JDBC">
<inbound>
<stdio:inbound-endpoint system="IN"/>
<inbound-endpoint ref="jdbcEndpointGetZ"/>
<forwarding-router/>
</inbound>
<outbound>
<outbound-pass-through-router>
<outbound-endpoint ref="jmsTest" transformer-refs="MapToTTRequest
ObjectToJMS"/>
</outbound-pass-through-router>
</outbound>
</service>

<service name="JMS">
<inbound>
<inbound-endpoint ref="jmsTest" transformer-refs="JMSToObject"/>
-->
<!-- Tried adding other transformers here also, such as a custom
TTRequestToString, aswell as ObjectToString without any improvement-->
<!--
</inbound>
<echo-component/>
<outbound>
<outbound-pass-through-router>
<stdio:outbound-endpoint system="OUT" />
</outbound-pass-through-router>
</outbound>
</service>
</model>
End not working example-->
</mule>

And this is the error message that is produced in the non-working example:

INFO 2008-05-28 14:01:14,725 [jmsConnector.dispatcher.1]
org.mule.transport.jms.JmsMessageDispatcher: Connected:
JmsMessageDispatcher{this=1ca209e, endpoint=jms://esb.test.jms,
disposed=false}
ERROR 2008-05-28 14:01:14,955 [JMS.2]
org.mule.service.DefaultServiceExceptionStrategy:
********************************************************************************
Message : The object transformed is of type: "TTRequest", but
the expected return type is "String"
Type : org.mule.api.transformer.TransformerException
Code : MULE_ERROR-65053
JavaDoc :
http://mule.mulesource.org/docs/apidocs/org/mule/api/transformer/TransformerException.html
Transformer : JMSMessageToObject{this=139e351,
name='_JMSMessageToString', ignoreBadInput=false, returnClass=class
java.lang.String, sourceTypes=[interface javax.jms.Message, interface
javax.jms.TextMessage, interface javax.jms.ObjectMessage, interface
javax.jms.BytesMessage, interface javax.jms.MapMessage, interface
javax.jms.StreamMessage]}
********************************************************************************
Exception stack is:
1. The object transformed is of type: "TTRequest", but the expected return
type is "String" (org.mule.api.transformer.TransformerException)
org.mule.transformer.AbstractTransformer:87
(http://mule.mulesource.org/docs/apidocs/org/mule/api/transformer/TransformerException.html)
********************************************************************************
Root Exception stack trace:
org.mule.api.transformer.TransformerException: The object transformed is of
type: "TTRequest", but the expected return type is "String"
at
org.mule.transformer.AbstractTransformer.checkReturnClass(AbstractTransformer.java:87)
at
org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:267)
at
org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:169)
at
org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:118)
at
org.mule.DefaultMuleMessage.getPayloadAsString(DefaultMuleMessage.java:274)
at
org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:392)
at
org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:377)
at
org.mule.DefaultMuleEventContext.getMessageAsString(DefaultMuleEventContext.java:170)
at
org.mule.component.simple.LogComponent.onCall(LogComponent.java:31)
at
org.mule.component.simple.EchoComponent.onCall(EchoComponent.java:25)
at
org.mule.model.resolvers.CallableEntryPointResolver.invoke(CallableEntryPointResolver.java:52)
at
org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:50)
at
org.mule.component.DefaultLifecycleAdapter.intercept(DefaultLifecycleAdapter.java:202)
at
org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:82)
at
org.mule.component.AbstractJavaComponent.doOnCall(AbstractJavaComponent.java:73)
at
org.mule.component.AbstractComponent.onCall(AbstractComponent.java:87)
at
org.mule.model.seda.SedaService$ComponentStageWorker.run(SedaService.java:533)
at org.mule.work.WorkerContext.run(WorkerContext.java:310)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Unknown Source)

********************************************************************************
--
View this message in context: http://www.nabble.com/Re%3A-Question-about-JMSMessageToObject-for-Object-tp17365619p17511225.html


Sent from the Mule - User mailing list archive at Nabble.com.

Ove Gram Nipen

unread,
Jun 2, 2008, 9:46:18 AM6/2/08
to us...@mule.codehaus.org
On Wed, 2008-05-28 at 05:11 -0700, paven wrote:

Hi, paven

> <service name="JMS">
> <inbound>
> <inbound-endpoint ref="jmsTest" transformer-refs="JMSToObject"/>
> -->
> <!-- Tried adding other transformers here also, such as a custom
> TTRequestToString, aswell as ObjectToString without any improvement-->
> <!--
> </inbound>
> <echo-component/>
> <outbound>
> <outbound-pass-through-router>
> <stdio:outbound-endpoint system="OUT" />
> </outbound-pass-through-router>
> </outbound>
> </service>

If you take a look at the echo component, it expects the incoming
message to be a String:

public class EchoComponent extends LogComponent implements EchoService
{
public Object onCall(MuleEventContext context) throws Exception
{
super.onCall(context);
return context.transformMessage();
}

public String echo(String echo)
{
return echo;
}
}

The error occurs when EchoComponent tries to do super.onCall(context).
This is because super (that is, LogComponent) calls the transformers to
get the message payload as String in order to log it. In your config
above, the transformed object is of type TTRequest, since it is only
transformed from JMSMessage to TTRequest when it passes through the
JMSMessageToObject transformer.



> Root Exception stack trace:
> org.mule.api.transformer.TransformerException: The object transformed is of
> type: "TTRequest", but the expected return type is "String"
> at
> org.mule.transformer.AbstractTransformer.checkReturnClass(AbstractTransformer.java:87)
> at
> org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:267)
> at
> org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:169)
> at
> org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:118)
> at
> org.mule.DefaultMuleMessage.getPayloadAsString(DefaultMuleMessage.java:274)
> at
> org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:392)
> at
> org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:377)
> at
> org.mule.DefaultMuleEventContext.getMessageAsString(DefaultMuleEventContext.java:170)
> at
> org.mule.component.simple.LogComponent.onCall(LogComponent.java:31)
> at
> org.mule.component.simple.EchoComponent.onCall(EchoComponent.java:25)


I'm a bit surprised that adding TTRequestToString like below didn't
help:
 


<service name="JMS">
<inbound>
<inbound-endpoint ref="jmsTest"

transformer-refs="JMSToObject TTRequestToString"/>
</inbound>
...
</service>

Can you post the error message you get with this config?

--
Regards,
Ove Gram Nipen

---------------------------------------------------------------------

paven

unread,
Jun 3, 2008, 5:01:43 AM6/3/08
to us...@mule.codehaus.org

Ove Gram Nipen wrote:
>
> Can you post the error message you get with this config?
>

Hi Ove,

Here are two examples that try to transform the result from JMS before
sending it to the echoComponent, I tried the ObjectToString because it would
seem reasonable that TTrequest that is an object would be possible to
convert using this. And the second one is using the custom transformer
described at the bottom.

Best Regards,
Mattias

With these transformers:


<inbound-endpoint ref="jmsTest" transformer-refs="JMSToObject

ObjectToString"/>

I get this error:

********************************************************************************
Message : The object transformed is of type: "TTRequest", but


the expected return type is "String"

Type : org.mule.api.transformer.TransformerException
Code : MULE_ERROR-65053
JavaDoc :
http://mule.mulesource.org/docs/apidocs/org/mule/api/transformer/TransformerException.html

Transformer : JMSMessageToObject{this=2b7db1,


name='_JMSMessageToString', ignoreBadInput=false,
returnClass=class java.lang.String, sourceTypes=[interface
javax.jms.Message, interface javax.jms.TextMessage,
interface javax.jms.ObjectMessage, interface javax.jms.BytesMessage,
interface javax.jms.MapMessage,
interface javax.jms.StreamMessage]}
********************************************************************************
Exception stack is:

1. The object transformed is of type: "TTRequest", but the expected return
type is "String"

(org.mule.api.transformer.TransformerException)
org.mule.transformer.AbstractTransformer:87
(http://mule.mulesource.org/docs/apidocs/org/mule/api/transformer/TransformerException.html)
********************************************************************************

Root Exception stack trace:
org.mule.api.transformer.TransformerException: The object transformed is of
type: "TTRequest", but the expected return
type is "String"
at
org.mule.transformer.AbstractTransformer.checkReturnClass(AbstractTransformer.java:87)
at
org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:267)
at
org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:169)
at
org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:118)
at
org.mule.DefaultMuleMessage.getPayloadAsString(DefaultMuleMessage.java:274)
at
org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:392)
at
org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:377)
at
org.mule.DefaultMuleEventContext.getMessageAsString(DefaultMuleEventContext.java:170)
at
org.mule.component.simple.LogComponent.onCall(LogComponent.java:31)
at
org.mule.component.simple.EchoComponent.onCall(EchoComponent.java:25)

at
org.mule.model.resolvers.CallableEntryPointResolver.invoke(CallableEntryPointResolver.java:52)
at
org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:50)
at
org.mule.component.DefaultLifecycleAdapter.intercept(DefaultLifecycleAdapter.java:202)
at
org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:82)
at
org.mule.component.AbstractJavaComponent.doOnCall(AbstractJavaComponent.java:73)
at
org.mule.component.AbstractComponent.onCall(AbstractComponent.java:87)
at
org.mule.model.seda.SedaService$ComponentStageWorker.run(SedaService.java:533)
at org.mule.work.WorkerContext.run(WorkerContext.java:310)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Unknown Source)

********************************************************************************

And with these transformers:


<inbound-endpoint ref="jmsTest" transformer-refs="JMSToObject
TTRequestToString"/>


I get this error:
********************************************************************************
Message : The object transformed is of type: "TTRequest", but


the expected return type is "String"

Type : org.mule.api.transformer.TransformerException
Code : MULE_ERROR-65053
JavaDoc :
http://mule.mulesource.org/docs/apidocs/org/mule/api/transformer/TransformerException.html

Transformer : JMSMessageToObject{this=2b7db1,


name='_JMSMessageToString', ignoreBadInput=false,
returnClass=class java.lang.String, sourceTypes=[interface
javax.jms.Message, interface javax.jms.TextMessage,
interface javax.jms.ObjectMessage, interface javax.jms.BytesMessage,
interface javax.jms.MapMessage,
interface javax.jms.StreamMessage]}
********************************************************************************
Exception stack is:

1. The object transformed is of type: "TTRequest", but the expected return
type is "String"


(org.mule.api.transformer.TransformerException)
org.mule.transformer.AbstractTransformer:87
(http://mule.mulesource.org/docs/apidocs/org/mule/api/transformer/TransformerException.html)
********************************************************************************

Root Exception stack trace:
org.mule.api.transformer.TransformerException: The object transformed is of
type: "TTRequest", but the expected return
type is "String"
at
org.mule.transformer.AbstractTransformer.checkReturnClass(AbstractTransformer.java:87)
at
org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:267)
at
org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:169)
at
org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:118)
at
org.mule.DefaultMuleMessage.getPayloadAsString(DefaultMuleMessage.java:274)
at
org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:392)
at
org.mule.DefaultMuleEvent.getMessageAsString(DefaultMuleEvent.java:377)
at
org.mule.DefaultMuleEventContext.getMessageAsString(DefaultMuleEventContext.java:170)
at
org.mule.component.simple.LogComponent.onCall(LogComponent.java:31)
at
org.mule.component.simple.EchoComponent.onCall(EchoComponent.java:25)

at
org.mule.model.resolvers.CallableEntryPointResolver.invoke(CallableEntryPointResolver.java:52)
at
org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:50)
at
org.mule.component.DefaultLifecycleAdapter.intercept(DefaultLifecycleAdapter.java:202)
at
org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:82)
at
org.mule.component.AbstractJavaComponent.doOnCall(AbstractJavaComponent.java:73)
at
org.mule.component.AbstractComponent.onCall(AbstractComponent.java:87)
at
org.mule.model.seda.SedaService$ComponentStageWorker.run(SedaService.java:533)
at org.mule.work.WorkerContext.run(WorkerContext.java:310)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Unknown Source)

********************************************************************************


The custom transformer is defined like this:


package org.mypackage;

import org.mule.api.transformer.TransformerException;
import org.somepackage.TTRequest;
import org.mule.transformer.AbstractTransformer;

public class TTRequestToString extends AbstractTransformer
{

public TTRequestToString()
{
registerSourceType(TTRequest.class);
setReturnClass(String.class);
}

public Object doTransform(Object src, String encoding) throws
TransformerException
{
TTRequest request = (TTRequest)src;
String args =
"{" + request.getId()
+ " " + request.getTicketNumber()
+ " " + request.getStatus()
+ " " + request.getTransactionType()
+ " " + request.getTicketNumber()
+ " " + request.getCCNumber()
+ " " + request.getCSCode()
+ " " + request.getStatus()
+ " " + request.getSummary()
+ " " + request.getDescription()
+ " " + request.getRequestArea()
+ " " + request.getPriority()
+ " " + request.getCreationDate()
+ " " + request.getGroupName()
+ " " + request.getFirstName()
+ " " + request.getLastName()
+ " " + request.getPhoneNumber()
+ " " + request.getEmail()
+ " " + request.getAddress()
+ " " + request.getProperties()
+ " " + request.getSerialNumber()
+ " " + request.getActivityDescription()
+ " " + request.getActivityType()
+ " " + request.getCECriteria() + "}";

return args;
}

}

--
View this message in context: http://www.nabble.com/Re%3A-Question-about-JMSMessageToObject-for-Object-tp17365619p17619167.html


Sent from the Mule - User mailing list archive at Nabble.com.

Ove Gram Nipen

unread,
Jun 3, 2008, 5:45:04 AM6/3/08
to us...@mule.codehaus.org
On Tue, 2008-06-03 at 02:01 -0700, paven wrote:
> Hi Ove,
>
> Here are two examples that try to transform the result from JMS before
> sending it to the echoComponent, I tried the ObjectToString because it would
> seem reasonable that TTrequest that is an object would be possible to
> convert using this. And the second one is using the custom transformer
> described at the bottom.

OK, so basically you get the same error no matter what transformers you
put in there. Maybe you should just use a bridge component instead of
the echo component. If that's not possible, you should make sure the
message is transformed to String before it hits the inbound endpoint of
your echo component (as in your working example).

--
Best regards,
Ove Gram Nipen

Reply all
Reply to author
Forward
0 new messages