Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using @ImplementedBy annotation will trigger stack overflow error in Dev mode #1

Closed
greenlaw110 opened this issue May 30, 2015 · 1 comment
Labels

Comments

@greenlaw110
Copy link
Contributor

When running app in dev mode where source code is compiled in memory, binding service with @ImplementedBy will cause StackOverflowError, something like:

Caused by: java.lang.StackOverflowError
        at java.lang.StringCoding.safeTrim(StringCoding.java:76)
        at java.lang.StringCoding.access$300(StringCoding.java:50)
        at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:305)
        at java.lang.StringCoding.encode(StringCoding.java:344)
        at java.lang.String.getBytes(String.java:916)
        at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
        at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
        at java.io.File.exists(File.java:813)
        at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:1080)
        at sun.misc.URLClassPath$FileLoader.findResource(URLClassPath.java:1047)
        at sun.misc.URLClassPath.findResource(URLClassPath.java:176)
        at java.net.URLClassLoader$2.run(URLClassLoader.java:551)
        at java.net.URLClassLoader$2.run(URLClassLoader.java:549)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findResource(URLClassLoader.java:548)
        at java.lang.ClassLoader.getResource(ClassLoader.java:1147)
        at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
        at java.lang.ClassLoader.getResourceAsStream(ClassLoader.java:1348)
        at act.app.AppClassLoader.bytecode(AppClassLoader.java:264)
        at act.app.AppClassLoader.enhancedBytecode(AppClassLoader.java:274)
        at act.app.AppCompiler$2.findType(AppCompiler.java:151)
        at act.app.AppCompiler$2.findType(AppCompiler.java:114)
        at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createPackage(LookupEnvironment.java:756)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.buildTypeBindings(CompilationUnitScope.java:107)
        at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.buildTypeBindings(LookupEnvironment.java:189)
        at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:723)
        at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:383)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:428)
        at act.app.AppCompiler.compile(AppCompiler.java:90)
        at act.app.DevModeClassLoader.bytecodeFromSource(DevModeClassLoader.java:151)
        at act.app.DevModeClassLoader.appBytecode(DevModeClassLoader.java:71)
        at act.app.AppClassLoader.bytecode(AppClassLoader.java:259)
        at act.app.AppClassLoader.enhancedBytecode(AppClassLoader.java:274)
        at act.app.AppCompiler$2.findType(AppCompiler.java:151)
        at act.app.AppCompiler$2.findType(AppCompiler.java:114)
        at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:158)
        at org.eclipse.jdt.internal.compiler.lookup.PackageBinding.getTypeOrPackage(PackageBinding.java:201)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findImport(CompilationUnitScope.java:468)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findSingleImport(CompilationUnitScope.java:522)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInImports(CompilationUnitScope.java:399)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInTypes(CompilationUnitScope.java:447)
        at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:763)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:470)
        at act.app.AppCompiler.compile(AppCompiler.java:90)
        at act.app.DevModeClassLoader.bytecodeFromSource(DevModeClassLoader.java:151)
        at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInTypes(CompilationUnitScope.java:447)
        at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:763)
        at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:470)
        at act.app.AppCompiler.compile(AppCompiler.java:90)
        at act.app.DevModeClassLoader.bytecodeFromSource(DevModeClassLoader.java:151)
        at act.app.DevModeClassLoader.appBytecode(DevModeClassLoader.java:71)
        at act.app.AppClassLoader.bytecode(AppClassLoader.java:259)
        at act.app.AppClassLoader.enhancedBytecode(AppClassLoader.java:274)
        at act.app.AppCompiler$2.findType(AppCompiler.java:151)
        at act.app.AppCompiler$2.findType(AppCompiler.java:114)

This is an unknown issue of ActFramework. The workaround is not to use @ImplementedBy binding, instead use Linked binding.

For example, suppose your service is:

@ImplementedBy(FooServiceImpl.class)
public interface FooService() {
    void bar();
}

And your implementation is:

public class FooServiceImpl {
    public void bar() {
          System.out.println("bar");
    }
}

Instead of annotating FooService with @ImplementedBy(FooServiceImpl.class), create a module to link them together:

public class MyBindingModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(FooService.class).to(FooServiceImpl.class);
    }
}
@greenlaw110
Copy link
Contributor Author

Forward to actframework/actframework#5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant