feroult / yawp

Kotlin/Java API framework for Google Appengine
http://yawp.io
MIT License
132 stars 20 forks source link

Problem when has an method in Action #45

Closed danilodeLuca closed 8 years ago

danilodeLuca commented 8 years ago

Hello,

Apply the attached file and run tests. diff-yawp.txt

One solution would be to not scan methods that don't have any annotation. io.yawp.repository.EndpointScanner.scanActions() - L 154, before add

private void scanActions() {
        Set<Class<? extends Action>> clazzes = endpointsPackage.getSubTypesOf(Action.class);

        for (Class<? extends Action> actionClazz : clazzes) {
            Class<?> objectClazz = ReflectionUtils.getGenericParameter(actionClazz);

            if (objectClazz == null) {
                continue;
            }

            for (Method method : actionClazz.getDeclaredMethods()) {
                if(method.getAnnotations() != null && method.getAnnotations().length > 0) {
                    addAction(objectClazz, method);
                }
            }
        }
    }

Stack:

java.lang.ExceptionInInitializerError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195)
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.RuntimeException: Invalid Action: io.yawp.repository.models.parents.Child.xpto
    at io.yawp.repository.EndpointScanner.createActionMethod(EndpointScanner.java:194)
    at io.yawp.repository.EndpointScanner.addAction(EndpointScanner.java:176)
    at io.yawp.repository.EndpointScanner.scanActions(EndpointScanner.java:154)
    at io.yawp.repository.EndpointScanner.generateEndpointsMap(EndpointScanner.java:61)
    at io.yawp.repository.EndpointScanner.scan(EndpointScanner.java:45)
    at io.yawp.commons.utils.EndpointTestCase.<clinit>(EndpointTestCase.java:20)
    ... 22 more
Caused by: io.yawp.repository.actions.InvalidActionMethodException
    at io.yawp.repository.actions.ActionParameters.<init>(ActionParameters.java:42)
    at io.yawp.repository.actions.ActionMethod.<init>(ActionMethod.java:24)
    at io.yawp.repository.EndpointScanner.createActionMethod(EndpointScanner.java:192)
    ... 27 more
danilodeLuca commented 8 years ago

Pull request was done!

feroult commented 8 years ago

Tks for the commit @danilodeLuca :heart:

Fixed in 1.3.14

Didn't see your pull request after the ticket.

I've used ActionMethod.isAction to check only specific action's annotations. The other part of the solution was the same.