leandreck / spring-typescript-services

Generate typescript services and type interfaces from spring annotated restcontrollers.
Apache License 2.0
29 stars 16 forks source link

Not sure the underlying issue but get NPE when my controller has a Type that refers itself, may be a jdk issue #80

Open ravisomepalli-eb opened 6 years ago

ravisomepalli-eb commented 6 years ago
import java.util.HashMap;
import java.util.Map;

import org.leandreck.endpoints.annotations.TypeScriptEndpoint;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@TypeScriptEndpoint
public class TestController {
    @GetMapping(value = "/something", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public A getA() {
        return null;
    }

    public static class A {
        private HashMap<String, A> fieldName;
        public HashMap<String, A> getFieldName() {
            return fieldName;
        }
        public void setFieldName(HashMap<String, A> fieldName) {
            this.fieldName = fieldName;
        }
    }
}

error: Unkown Error occured, please file a Bug https://github.com/leandreck/spring-typescript-services/issues org.leandreck.endpoints.processor.model.UnkownTypeProcessingException: org.leandreck.endpoints.processor.model.UnkownTypeProcessingException: java.lang.NullPointerException at org.leandreck.endpoints.processor.model.TypeNodeFactory.initType(TypeNodeFactory.java:205) at org.leandreck.endpoints.processor.model.TypeNodeFactory.createTypeNode(TypeNodeFactory.java:101) at org.leandreck.endpoints.processor.model.MethodNodeFactory.defineReturnType(MethodNodeFactory.java:77) at org.leandreck.endpoints.processor.model.MethodNodeFactory.createMethodNode(MethodNodeFactory.java:65) at org.leandreck.endpoints.processor.model.EndpointNodeFactory.lambda$defineMethods$1(EndpointNodeFactory.java:77) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418) at org.leandreck.endpoints.processor.model.EndpointNodeFactory.defineMethods(EndpointNodeFactory.java:79) at org.leandreck.endpoints.processor.model.EndpointNodeFactory.createEndpointNode(EndpointNodeFactory.java:56) at org.leandreck.endpoints.processor.TypeScriptEndpointProcessor.processEndpoints(TypeScriptEndpointProcessor.java:122) at org.leandreck.endpoints.processor.TypeScriptEndpointProcessor.process(TypeScriptEndpointProcessor.java:98) at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794) at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705) at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91) at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035) at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176) at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170) at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856) at com.sun.tools.javac.main.Main.compile(Main.java:523) at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129) at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:49) at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:36) at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:99) at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:52) at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37) at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35) at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25) at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:198) at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:183) at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:120) at sun.reflect.GeneratedMethodAccessor153.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134) at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63) at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88) at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99) at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625) at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.lang.Thread.run(Thread.java:748) Caused by: org.leandreck.endpoints.processor.model.UnkownTypeProcessingException: java.lang.NullPointerException at org.leandreck.endpoints.processor.model.TypeNodeFactory.initType(TypeNodeFactory.java:205) at org.leandreck.endpoints.processor.model.TypeNodeFactory.createTypeNode(TypeNodeFactory.java:133) at org.leandreck.endpoints.processor.model.TypeNodeFactory.lambda$defineChildren$4(TypeNodeFactory.java:143) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at org.leandreck.endpoints.processor.model.TypeNodeFactory.defineChildren(TypeNodeFactory.java:144) at org.leandreck.endpoints.processor.model.typefactories.SimpleTypeNodeFactory.createTypeNode(SimpleTypeNodeFactory.java:85) at org.leandreck.endpoints.processor.model.TypeNodeFactory.initType(TypeNodeFactory.java:200) ... 80 more Caused by: java.lang.NullPointerException at org.leandreck.endpoints.processor.model.TypeNodeFactory$ProxyNode.getTypeName(TypeNodeFactory.java:301) at org.leandreck.endpoints.processor.model.TypeNodeFactory$ProxyNode.getTypeName(TypeNodeFactory.java:301) at org.leandreck.endpoints.processor.model.typefactories.MapTypeNodeFactory.defineNameFromMapType(MapTypeNodeFactory.java:96) at org.leandreck.endpoints.processor.model.typefactories.MapTypeNodeFactory.lambda$createTypeNode$0(MapTypeNodeFactory.java:70) at org.leandreck.endpoints.processor.model.typefactories.TypeNodeUtils.defineName(TypeNodeUtils.java:74) at org.leandreck.endpoints.processor.model.typefactories.MapTypeNodeFactory.createTypeNode(MapTypeNodeFactory.java:70) at org.leandreck.endpoints.processor.model.TypeNodeFactory.initType(TypeNodeFactory.java:200) ... 95 more 1 error

mkowalzik commented 6 years ago

No, it is definitely not a JDK issue. It is related to a wrong initialization order (a proxy object for A still waiting for completion of A).