Micronaut 中是否有 Springs Resource 的等效项?

Is there an equivalent for Springs Resource in Micronaut?

我正在将一个微型 Spring 引导应用程序迁移到 Micronaut 1.0.1,我想知道是否有 org.springframework.core.io.Resource 的等效项及其实现,例如 ClasspathResource

在 Spring 引导中,我使用其构造函数将资源注入到服务中。

@Service
public class MyService() {

    private final Resource resource;

    public MyService(Resource resource) { this.resource = resource; }
}

如何在 Micronaut 中执行此操作?

@Singleton
public class MyService() {

    private final Resource resource;

    @Inject
    public MyService(Resource resource) { this.resource = resource; }
}

在 Micronaut 中,您可以使用 io.micronaut.core.io.ResourceLoader 变体,例如 io.micronaut.core.io.scan.ClassPathResourceLoaderio.micronaut.core.io.file.FileSystemResourceLoader。获取它们的一种选择是通过 io.micronaut.core.io.ResourceResolver:

ClassPathResourceLoader loader = new ResourceResolver().getLoader(ClassPathResourceLoader.class).get();
Optional<URL> resource = loader.getResource("classpath:foo/bar.txt");

我用了io.micronaut.core.io.ResourceLoader。通过构造函数连接:

@Controller("root")
public class MyController {

    private final ResourceLoader loader;

    public MyController(ResourceLoader loader) {
        this.loader = loader;
    }

    @Get("/index")
    @Produces(MediaType.TEXT_HTML)
    public String greet() throws IOException {
        return new String(loader.getResourceAsStream("index.html").get().readAllBytes());
    }
}

我的 index.html 路径:src/main/resources/index.html

ResourceLoader works well but you can do better. In Micronaut you can use io.micronaut.core.io.Readable. It is roughly equivalent to Spring's Resource. You can also use Readable in ConfigurationProperties 从而将您的配置 yaml/properties 直接绑定到 Readable 属性:

micronaut:
  application:
    name: Demo
images:
  image-file: "classpath:images/bismarckia-nobilis.jpg"
  # image-file: "file:/path/to/images/bismarckia-nobilis.jpg"
  other-files:
    - "classpath:images/bismarckia-nobilis.jpg"
    - "classpath:images/bamboo.jpg"
    - "classpath:images/hibiscus.jpg"

我创建了:

你可以这样做

@Singleton
public class MyService {

    @Value("classpath:your-file.json")
    private Readable readable;
}

@Singleton
public class MyService {

    private final Readable readable;

    public MyService(@Value("classpath:your-file.json") Readable file) {
        this.readable = readable;
    }
}