milton2 icon indicating copy to clipboard operation
milton2 copied to clipboard

NullPointerException in SpecificityUtils

Open cimnine opened this issue 4 years ago • 0 comments

Caused by: java.lang.NullPointerException
	at io.milton.http.annotated.SpecificityUtils.sourceSpecifityIndex(SpecificityUtils.java:29) ~[milton-server-ce-2.7.2.4.jar:?]
	at io.milton.http.annotated.AbstractAnnotationHandler.getBestMethod(AbstractAnnotationHandler.java:100) ~[milton-server-ce-2.7.2.4.jar:?]
	at io.milton.http.annotated.AbstractAnnotationHandler.isCompatible(AbstractAnnotationHandler.java:183) ~[milton-server-ce-2.7.2.4.jar:?]
	at io.milton.http.annotated.AnnotationResourceFactory.instantiate(AnnotationResourceFactory.java:648) ~[milton-server-ce-2.7.2.4.jar:?]
	at io.milton.http.annotated.AnnotationResourceFactory.createAndAppend(AnnotationResourceFactory.java:792) ~[milton-server-ce-2.7.2.4.jar:?]
	at io.milton.http.annotated.ChildrenOfAnnotationHandler.execute(ChildrenOfAnnotationHandler.java:68) ~[milton-server-ce-2.7.2.4.jar:?]
	at io.milton.http.annotated.AnnoCollectionResource.initChildren(AnnoCollectionResource.java:176) ~[milton-server-ce-2.7.2.4.jar:?]
	... 42 more

An NPE is occurring in https://github.com/miltonio/milton2/blob/master/milton-server-ce/src/main/java/io/milton/http/annotated/SpecificityUtils.java#L28.

The following happens:

# Params
methodType = "interface java.nio.file.Path"
actualType = "class com.google.common.jimfs.JimfsPath"

# Code Flow
c = actualType // c = "class com.google.common.jimfs.JimfsPath"
i = 0
while (!methodType.equals(c)) // true
c = c.getSuperclass();  // c = "class java.lang.Object"
while (!methodType.equals(c)) // true
c = c.getSuperclass(); // c = null
while(!methodType.equals(c)) // true
c = c.getSuperclass(); // ==> NullPointerException, because c is null

My controller looks like this:

package foo.bar;

import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import io.milton.annotations.ChildrenOf;
import io.milton.annotations.ResourceController;
import io.milton.annotations.Root;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;

@ResourceController
public class MinimalVirtualFSDavController {
	private final FileSystem fs = Jimfs.newFileSystem(Configuration.unix());

	public MinimalVirtualFSDavController() {
		try {
			Path dir = Files.createDirectory(fs.getPath("/foo"));
			Files.writeString(fs.getPath(dir.toString(), "bar1"), "Hello", StandardCharsets.UTF_8);
			Files.writeString(fs.getPath(dir.toString(), "bar2"), "Hello", StandardCharsets.UTF_8);
			Files.writeString(fs.getPath(dir.toString(), "bar3"), "Hello", StandardCharsets.UTF_8);
			Files.writeString(fs.getPath(dir.toString(), "bar4"), "Hello", StandardCharsets.UTF_8);
			Files.writeString(fs.getPath(dir.toString(), "bar5"), "Hello", StandardCharsets.UTF_8);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Root
	public Path root() {
		return fs.getPath("/");
	}

	@ChildrenOf
	public List<Path> getChildrenOfDavFolder(Path p) {
		try {
			List<Path> collect = Files.list(p).collect(Collectors.toList());
			return collect;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return List.of();
	}
}

How could I implement this in a way that works with milton? Does milton even already support the java.nio.file.FileSystem API?

cimnine avatar Jul 27 '20 15:07 cimnine