Fork me on GitHub

Configuration and modes

Configuration

按照约定,Ninja将在conf / application.conf中查找配置文件.

application.conf是带有键和值的简单属性文件. "#"为注释.

# an arbitrary comment
application.name=Ninja demo application
application.cookie.prefix=NINJA

像任何其他Ninja文件一样,它都以UTF-8编码. 确保您的编辑器以正确的编码读取并保存文件.

Ninja属性可以做的比传统Java属性要多得多. 例如,可以通过名称来引用其他属性并将其组合.

serverName=myserver.com
serverPort=80
fullServerName=${serverName}:${serverPort}

fullServerName引用键的先前设置的值,并将返回myserver.com:80.

在您的应用程序内部,有两种访问属性的基本方法.

第一种方法是使用NinjaProperties.get(…) . 您必须先注入NinjaProperties,然后才能使用各种方法来检索属性.

@Inject 
NinjaProperties ninjaProperties;

public void myMethod() {
    String value = ninjaProperties.get("fullServerName")
    ... do even more...
}

获取属性的第二种方法是通过@Named(" fullServerName")注入属性.

/** An arbitrary constructor */
@Inject
ApplicationController(@Named("fullServerName") String fullServerName) {
    ... do something ...
}

顺便说说. 这真的很重要:属性由出色的Apache Configurations库读取和管理. 有关高级用法的更多信息,请参阅其手册 .

Configuring the modes

Ninja uses three predefined modes (test, dev and prod as defined in NinjaConstant.java). If no mode is set explicitly Ninja will use the prod mode. That means if you deploy Ninja via a war file to an arbitrary servlet container Ninja will use the prod mode.

Ninja的SuperDevMode会将模式设置为dev . Ninja的测试用例将默认使用模式测试 .

您可以通过设置Java系统属性ninja.mode来设置模式.

On the command line:
> java -Dninja.mode=dev

Or programmatically:
System.setProperty(NinjaConstant.MODE_KEY_NAME, NinjaConstant.MODE_DEV)

确保尽早设置系统属性,以便忍者从一开始就了解其模式.

如果要为不同的环境定义不同的属性,这些模式非常方便. 您可能要在运行测试时使用database1,在开发时使用database2,在生产环境中运行时使用database3.

Ninja通过在属性密钥之前使用模式前缀来支持该用例.

database.name=database_production   # will be used when no mode is set (or prod)
%prod.database.name=database_prod   # will be used when running in prod mode
%dev.database.name=database_dev     # will be used when running in dev mode
%test.database.name=database_test   # will be used when running in test mode

约定是使用"%"和模式名称后跟".".

HTTPS (SSL) support

从5.2.3版开始,Ninja在独立和SuperDevMode中都支持基本HTTPS(SSL). 虽然强烈建议使用其他在生产中处理SSL的方法(例如nginx),但在开发,测试或轻量产品使用期间,使用Ninja的内置支持十分方便.

Ninja附带了一个自签名SSL证书,该证书默认在开发测试模式下配置. 要在开发测试模式下启用SSL,您只需设置要启动HTTPS服务器的端口即可.

ninja.ssl.port=8443

这可以通过将其添加到conf / application.conf配置文件中或在运行Ninja的maven插件时在命令行上完成

mvn ninja:run -Dninja.ssl.port=8443

Ninja支持同时运行HTTP和HTTPS连接器. 如果您只想运行HTTPS,只需将ninja.port设置为-1以禁用它.

ninja.port=-1               # disable clear text http connector
ninja.ssl.port=8443         # enable ssl https connector

还可以配置SSL密钥库和信任库值. uri值可以是classpath:resourceName格式的路径资源,也可以是任何其他有效的Java URL值,因为使用了底层URL.openStream() . 请注意,在开发和测试模式下,默认密钥库为classpath:/ninja/standalone/ninja-development.keystore ,默认信任库为classpath:/ninja/standalone/ninja-development.truststore

ninja.ssl.keystore.uri=file:///var/etc/mysite.keystore
ninja.ssl.keystore.password=changeit
ninja.ssl.truststore.uri=file:///var/etc/mysite.truststore
ninja.ssl.truststore.password=changeit

Disabling diagnostic mode

从4.0.7版开始,Ninja对开发人员模式进行了新的诊断扩展,从ninja.NinjaDefault返回详细的诊断错误页面,而不是从System / views中提取模板的典型Result.

例如,在4.0.7之前的版本中,如果您的控制器类方法引发Exception,ninja.NinjaDefault的默认行为是在onException方法中捕获该异常并使用模板views / system / 500internalServerError.ftl返回结果. html . 默认系统视图是基本视图,比开发期间更适合在生产中使用.

从版本4.0.7开始, ninja.NinjaDefault中所有方法的默认行为是首先检查开发模式是否打开以及NinjaProperties.areDiagnosticsEnabled()是否为true. 如果两者都为true,则返回Result ,并将renderable设置为DiagnosticError实例. 由于DiagnosticError实现Renderable ,因此它知道如何将自身呈现到输出流,并且将绕过TemplateEngine .

诊断模式在PROD / TEST模式下会自动禁用,但在DEV模式下也可以禁用. 只需将以下内容添加到您的application.conf中

application.diagnostics=false

Retaining diagnostic mode if you provide conf.Ninja

如果提供自己的conf.Ninja并扩展ninja.NinjaDefault,则可能会丢失针对您覆盖的特定方法的诊断模式. 您可以通过调用super方法并有条件地返回其结果而不是您自己的结果来保留功能.

public class Ninja extends NinjaDefault {

    @Override
    public Result getInternalServerErrorResult(Context context, Exception exception) {
        if (isDiagnosticsEnabled()) {
            return super.getInternalServerErrorResult(context, exception);
        }

        // your impl only active in test/prod or dev (with diagnostic disabled)
    }

}

Configuring application’s base package

如果您想将所有Java代码保留在特定的程序包中,则可以定义

application.modules.package=com.someorganinization.somepackage

在这种情况下,您必须将路线

com.someorganization.somepackage.conf.Routes.java

和Guice应用程序配置模块位于

com.someorganization.somepackage.conf.Module.java

com.someorganization.somepackage.conf.ServletModule.java

accordingly.

External configuration for deployment

在服务器上运行时,您可能需要使用完全不同的配置. 这可以通过设置Java系统属性来完成:

java -Dninja.external.configuration=conf/production.conf

这告诉Ninja加载conf / production.conf. 它还将照常加载conf / application.conf,但是conf / production.conf中的值将覆盖conf / application.conf中的值.

这样,您可以与项目分开管理生产配置. 例如,当您的服务器密码仅对特定人群可用,而对全世界不可用时,您可能需要这样做. 或者,如果您的云托管服务商使用与产品,测试或开发人员完全不同的配置.

Ninja尝试从多个位置加载ninja.external.configuration中指定的文件:

它尝试按以下顺序加载:

  • 从URL.
  • 从绝对文件路径.
  • 从相对文件路径.
  • 从用户的主目录.
  • 从类路径.

Ninja使用出色的Apache Configurations库进行加载. 请参阅他们的手册以获取更多信息.

System properties to override

从Ninja v6.1.1开始,系统属性可以覆盖标准conf / application.conf或外部配置文件中设置的任何配置键. 例如,如果在conf / production.conf中将键db.connection.password设置为mypass ,则可以在运行时通过系统属性将其覆盖到otherpass ,如下所示:

java -Dninja.external.configuration=conf/production.conf -Ddb.connection.password=otherpass

前缀系统属性也受到尊重. 使用前面的示例,如果只希望该属性在测试模式下生效,则可以执行以下操作:

java -Dninja.external.configuration=conf/production.conf -D%test.db.connection.password=otherpass

Hot-reloading external configuration

默认情况下,Ninja不会重新加载您的外部配置. 但是,对于某些安装,热重载此配置而不是重新启动应用程序可能非常有用.

java -Dninja.external.reload=true -Dninja.external.configuration=conf/production.conf

如果运行时修改了配置,这会告诉Ninja重新加载您的配置.

Referencing environment variables in configuration files

您可以使用默认的Apache Commons配置语法在配置文件中引用系统属性:

%prod.db.connection.password=${env:DB_PASSWORD}

当涉及到在应用程序代码中不应该知道的生产凭证时,这特别方便.


by  ICOPY.SITE