transformers not working after update to 2.15.1

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

transformers not working after update to 2.15.1

Hans Orbaan
Hi all,

I am trying to update to 2.15.1 from 2.14.2 and am running into some trouble.
We have a lot of transformers that extend an abstractTransformer class. That abstractTransformer implements a Transformer interface with a transform method.
The various implementations usually return an XML class that can be marshalled, but the interface specifies Object as return (also tried generics, same issue as below).
This used to work but now it returns a stacktrace:
java.lang.NullPointerException: null
                at org.apache.camel.component.bean.BeanInfo.chooseBestPossibleMethodInfo(BeanInfo.java:762) ~[camel-core-2.15.1.jar:2.15.1]
                at org.apache.camel.component.bean.BeanInfo.chooseMethodWithMatchingBody(BeanInfo.java:735) ~[camel-core-2.15.1.jar:2.15.1]
                at org.apache.camel.component.bean.BeanInfo.chooseMethod(BeanInfo.java:603) ~[camel-core-2.15.1.jar:2.15.1]
                at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:254) ~[camel-core-2.15.1.jar:2.15.1]
                at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:183) ~[camel-core-2.15.1.jar:2.15.1]
                at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:153) ~[camel-core-2.15.1.jar:2.15.1]

The camel code that throws the exception:

    private MethodInfo chooseBestPossibleMethodInfo(Exchange exchange, Collection<MethodInfo> operationList, Object body,
                                                    List<MethodInfo> possibles, List<MethodInfo> possiblesWithException,
                                                    List<MethodInfo> possibleWithCustomAnnotation)
                               ......
                               ......
            for (MethodInfo methodInfo : operationList) {
                // nullpointer bodyParameterType
                if (methodInfo.getBodyParameterType().isInstance(body)) {
                    return methodInfo;
                }

This doesn't happen when the transformerImp implements the interface and the abstractTransformer does not.
This also doesn't happen when the return class in the interface is the same as that of the implementation. Just no subclasses allowed.

Could you have a look at the test cases I have created to show the problem:

////// MyRoute.java
@Component
public class MyRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("file:///data/proj_test")
            .log("file read")
            .transform().method(TransformerImpl.class, "transform")
            .log("transformed")
            .end();
    }
}
////// TransformerImpl.java
public class TransformerImpl extends AbstractTransformer {

    @Override
    public String transform(Exchange exchange) {
        return getTest();
    }
}
////// AbstractTransformer.java
public abstract class AbstractTransformer implements Transformer {
    protected String getTest() {
        return "test";
    }
}
////// Transformer.java
public interface Transformer {

    Object transform(Exchange exchange) ;
}

------------- TEST 2 (abstract method, also fails in 2.14.2 ?) ------------
reuse MyRoute.java
reuse TransformerImpl.java
////// AbstractTransformer.java
public abstract class AbstractTransformer {
    public abstract Object transform(Exchange exchange);
    protected String getTest() {
        return "test";
    }
}
------------- TEST 3 (generics abstract) ------------
reuse MyRoute.java
////// TransformerImpl.java
public class TransformerImpl extends AbstractTransformer<String> {

    @Override
    public String transform(Exchange exchange) {
        return "test";
    }
}
////// AbstractTransformer.java
public abstract class AbstractTransformer<TYPE> {
    public abstract TYPE transform(Exchange exchange);
    protected String getTest() {
        return "test";
    }
}
------------- TEST 3 (generics to interface, works in 2.14.2, not 2.15.1) ------------
reuse MyRoute.java
////// TransformerImpl.java
public class TransformerImpl extends AbstractTransformer<String>  {

    @Override
    public String transform(Exchange exchange) {
        return "test";
    }
}
////// AbstractTransformer.java
public abstract class AbstractTransformer<TYPE> implements Transformer<TYPE>{
    protected String getTest() {
        return "test";
    }
}
////// Transformer.java
public interface Transformer<TYPE> {

    TYPE transform(Exchange exchange) ;
}

Is this a bug or some change that was meant to do this?

Thanks for any help you can provide.
Reply | Threaded
Open this post in threaded view
|

Re: transformers not working after update to 2.15.1

Claus Ibsen-2
Hi

I have logged a ticket about the NPE
https://issues.apache.org/jira/browse/CAMEL-8624

On Fri, Apr 10, 2015 at 3:42 PM, Hans Orbaan <[hidden email]> wrote:

> Hi all,
>
> I am trying to update to 2.15.1 from 2.14.2 and am running into some trouble.
> We have a lot of transformers that extend an abstractTransformer class. That abstractTransformer implements a Transformer interface with a transform method.
> The various implementations usually return an XML class that can be marshalled, but the interface specifies Object as return (also tried generics, same issue as below).
> This used to work but now it returns a stacktrace:
> java.lang.NullPointerException: null
>                 at org.apache.camel.component.bean.BeanInfo.chooseBestPossibleMethodInfo(BeanInfo.java:762) ~[camel-core-2.15.1.jar:2.15.1]
>                 at org.apache.camel.component.bean.BeanInfo.chooseMethodWithMatchingBody(BeanInfo.java:735) ~[camel-core-2.15.1.jar:2.15.1]
>                 at org.apache.camel.component.bean.BeanInfo.chooseMethod(BeanInfo.java:603) ~[camel-core-2.15.1.jar:2.15.1]
>                 at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:254) ~[camel-core-2.15.1.jar:2.15.1]
>                 at org.apache.camel.component.bean.BeanInfo.createInvocation(BeanInfo.java:183) ~[camel-core-2.15.1.jar:2.15.1]
>                 at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:153) ~[camel-core-2.15.1.jar:2.15.1]
>
> The camel code that throws the exception:
>
>     private MethodInfo chooseBestPossibleMethodInfo(Exchange exchange, Collection<MethodInfo> operationList, Object body,
>                                                     List<MethodInfo> possibles, List<MethodInfo> possiblesWithException,
>                                                     List<MethodInfo> possibleWithCustomAnnotation)
>                                ......
>                                ......
>             for (MethodInfo methodInfo : operationList) {
>                 // nullpointer bodyParameterType
>                 if (methodInfo.getBodyParameterType().isInstance(body)) {
>                     return methodInfo;
>                 }
>
> This doesn't happen when the transformerImp implements the interface and the abstractTransformer does not.
> This also doesn't happen when the return class in the interface is the same as that of the implementation. Just no subclasses allowed.
>
> Could you have a look at the test cases I have created to show the problem:
>
> ////// MyRoute.java
> @Component
> public class MyRoute extends RouteBuilder {
>     @Override
>     public void configure() throws Exception {
>         from("file:///data/proj_test")
>             .log("file read")
>             .transform().method(TransformerImpl.class, "transform")
>             .log("transformed")
>             .end();
>     }
> }
> ////// TransformerImpl.java
> public class TransformerImpl extends AbstractTransformer {
>
>     @Override
>     public String transform(Exchange exchange) {
>         return getTest();
>     }
> }
> ////// AbstractTransformer.java
> public abstract class AbstractTransformer implements Transformer {
>     protected String getTest() {
>         return "test";
>     }
> }
> ////// Transformer.java
> public interface Transformer {
>
>     Object transform(Exchange exchange) ;
> }
>
> ------------- TEST 2 (abstract method, also fails in 2.14.2 ?) ------------
> reuse MyRoute.java
> reuse TransformerImpl.java
> ////// AbstractTransformer.java
> public abstract class AbstractTransformer {
>     public abstract Object transform(Exchange exchange);
>     protected String getTest() {
>         return "test";
>     }
> }
> ------------- TEST 3 (generics abstract) ------------
> reuse MyRoute.java
> ////// TransformerImpl.java
> public class TransformerImpl extends AbstractTransformer<String> {
>
>     @Override
>     public String transform(Exchange exchange) {
>         return "test";
>     }
> }
> ////// AbstractTransformer.java
> public abstract class AbstractTransformer<TYPE> {
>     public abstract TYPE transform(Exchange exchange);
>     protected String getTest() {
>         return "test";
>     }
> }
> ------------- TEST 3 (generics to interface, works in 2.14.2, not 2.15.1) ------------
> reuse MyRoute.java
> ////// TransformerImpl.java
> public class TransformerImpl extends AbstractTransformer<String>  {
>
>     @Override
>     public String transform(Exchange exchange) {
>         return "test";
>     }
> }
> ////// AbstractTransformer.java
> public abstract class AbstractTransformer<TYPE> implements Transformer<TYPE>{
>     protected String getTest() {
>         return "test";
>     }
> }
> ////// Transformer.java
> public interface Transformer<TYPE> {
>
>     TYPE transform(Exchange exchange) ;
> }
>
> Is this a bug or some change that was meant to do this?
>
> Thanks for any help you can provide.



--
Claus Ibsen
-----------------
Red Hat, Inc.
Email: [hidden email]
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/