当前位置: 首页 > 知识库问答 >
问题:

如何在java play中创建、使用和实例使用GUI

谷梁星雨
2023-03-14

我正在尝试使用guice,我想在JavaPlay2.6中创建一个单例随机webservice客户端

现在我有了WS-client,它作为java播放模块加载。当我运行应用程序时,没有问题,我的客户机能够使用java play配置(com.typesafe.config.config),这是注入的。但是如果我尝试在其他任何地方使用我的客户机,我会得到一个错误,说没有com的实现。类型安全。配置。配置已绑定

这是我的(非常简单的)客户:

import play.Logger;
import com.typesafe.config.Config;

@Singleton
public class MyClient {
    final Config config;

    @Inject
    public MyClient(Config config) {
        this.config = config;
        Logger.warn("constructor called")
        Logger.warn("Some config param:"+config.getString("some_param"))
    }

    public void doSomething() {
        Logger.warn("doSomething() called")
    }

}

实现Guice的AbstractModule的我的模块:

import com.google.inject.AbstractModule;

public class MyClientModule extends AbstractModule {
    @Override 
    protected void configure() {
        bind(MyClient.class).asEagerSingleton();
    }

}

当我告诉Play在applicationf中将其用作模块时。conf,它可以工作(我在控制台中得到名为“的”构造函数和“Some config param”警告日志):

play {
  modules {
    enabled += external.MyClientModule
  }
}

但是如果我尝试从我的家庭控制器调用它

public class HomeController extends Controller {
    public Result index() {
        Injector myClientInjector = Guice.createInjector(new MyClientModule());
        MyClient myClient = myClientInjector.getInstance(MyClient.class);
        return ok(views.html.index.render());
    }
}

然后我得到以下错误:

[CreationException: Unable to create injector, see the following errors:

1) No implementation for com.typesafe.config.Config was bound.
  while locating com.typesafe.config.Config
    for the 1st parameter of external.MyClient.<init>(MyClient.java:121)
  at external.MyClientModule.configure(MyClientModule.java:8)

1 error]

我很确定这里有一些错误,那么绑定它然后使用它的正确方法是什么?


共有2个答案

林华皓
2023-03-14

asagersingleton()绑定意味着它的绑定速度尽可能快。在本例中,配置尚未绑定,因此失败。

使用

bind(MyClient.class).in(Singleton.class)

当需要的时候,它会把它作为一个单例绑定起来。

在HomeController中,使用构造函数注入:

@Inject
public HomeController (final MyClient myclient) {
    this.myclient = myclient;
}

您可以像这样注释1个构造函数,因此它需要包含您想要注入的所有类。您可以组合构造函数和字段注入,但不建议这样做。

施喜
2023-03-14

在HomeController中,使用构造函数注入:

@Inject
public HomeController (final MyClient myclient) {
    this.myclient = myclient;
}

您可以像这样注释1个构造函数,因此它需要包含您想要注入的所有类。您可以组合构造函数和字段注入,但不建议这样做。

 类似资料:
  • 问题内容: 我有一个注释,该注释根据此惯用法接收“动态”参数,即接口类型的参数。简而言之: 现在,要评估此参数,我需要创建提供的实现的实例。上面链接的答案是在运行时执行的。但是,我正在按照本教程编写“实时”(即编译时)注释处理器。使用类型时,必须考虑它们可能尚未编译。本教程以以下方式处理该问题(在这种情况下,检索类型的名称): classTypeMirror.asElement(); qualif

  • 问题内容: 当我阅读 Effective Java时 ,作者告诉我,单元素类型是实现单例的最佳方法,因为我们不必考虑复杂的序列化或反射攻击。这意味着我们无法创建使用反射的实例,对吗? 我已经做了一些测试,并在这里上课: 然后我尝试创建一个实例: 如您所知,它不起作用。当我更改关键字来,它的工作原理。我想知道为什么。谢谢。 问题答案: 这是语言内置的。根据Java语言规范(§8.9): 尝试显式实例

  • 关于实时上色 通过将图稿转换为实时上色组,您可以任意对它们进行着色,就像对画布或纸上的绘画进行着色一样。您可以使用不同颜色为每个路径段描边,并使用不同的颜色、图案或渐变填充每个封闭路径(注意,并不仅仅是封闭路径)。 “实时上色”是一种创建彩色图画的直观方法。通过采用这种方法,您可以使用 Illustrator 的所有矢量绘画工具,而将绘制的全部路径视为在同一平面上。也就是说,没有任何路径位于其他路

  • 关于色板 色板 是命名的颜色、色调、渐变和图案。与文档相关联的色板出现在“色板”面板中。色板可以单独出现,也可以成组出现。 可以打开来自其他 Illustrator 文档和各种颜色系统的色板库。色板库显示在单独的面板中,不与文档一起存储。 “色板”面板和色板库面板可包括以下类型的色板: 印刷色 印刷色使用四种标准印刷色油墨的组合打印:青色、洋红色、黄色和黑色。默认情况下,Illustrator 将