9

Spring Boot ドキュメントには、application.properties ファイルでプロパティを設定できると書かれています。
しかし、設定できる利用可能なプロパティをリストしたドキュメントが見つかりません。
そのようなドキュメントはどこにありますか?

たとえば、埋め込みサーブレットの documentRoot を設定したいとします。
setDocumentRoot() メソッドが AbstractEmbeddedServletContainerFactory.java に実装されていることがわかりました。
しかし、メソッドをいつどこで呼び出すか、または application.properties で設定できるプロパティの名前がわかりません。
Spring Boot の目的は構成を容易にすることなので、簡単なはずだと思います。

前もって感謝します。

アップデート:

M. Deinum さんの提案で、application.properties に「server.document-root: someDirectoryName」を追加したところ、以下のエラーが発生しました。

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'document-root' of bean class [org.springframework.boot.context.embedded.properties.ServerProperties]: Bean property 'document-root' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1057)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:915)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:82)
    at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:730)
    at org.springframework.validation.DataBinder.doBind(DataBinder.java:626)
    at org.springframework.boot.bind.RelaxedDataBinder.doBind(RelaxedDataBinder.java:78)
    at org.springframework.validation.DataBinder.bind(DataBinder.java:611)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:232)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:204)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessAfterInitialization(ConfigurationPropertiesBindingPostProcessor.java:312)
    ... 31 more

org.springframework.boot.context.embedded.properties.ServerProperties の実装方法が原因だと思います。( https://github.com/spring-projects/spring-boot/blob/97cb7f096798ecd016de71f892fa55585d45f5eb/spring-boot/src/main/java/org/springframework/boot/context/embedded/properties/ServerProperties.javaを参照)

「@ConfigurationProperties(name = "server", ignoreUnknownFields = false)」を宣言します。そのため、「server」で始まるアプリケーション プロパティを管理し、不明なプロパティ名を許可しません。
また、documentRoot の getter/setter はサポートしていません。

ところで、ServerProperties クラスは org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration によって Bean に作成されます ( https://github.com/spring-projects/spring-boot/blob/97cb7f096798ecd016de71f892fa55585d45f5eb/spring-boot-autoconfigure/srcを参照)。 /main/java/org/springframework/boot/autoconfigure/web/ServerPropertiesAutoConfiguration.java ) を設定して、構成プロセスに参加できるようにします。

そこで、ServerProperties 風のものと ServerPropertiesAutoConfiguration 風のものを自分で実装してみました。
コードは次のとおりです。

package com.sample.server;

import java.io.File;

import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SampleConfiguration
{
    @Bean
    public SampleServerProperties sampleServerProperties()
    {
        return new SampleServerProperties();
    }

    @ConfigurationProperties(name = "sample.server")
    public static class SampleServerProperties
        implements EmbeddedServletContainerCustomizer 
    {
        private String documentRoot;
        public String getDocumentRoot()
        {
            return documentRoot;
        }
        public void setDocumentRoot(String documentRoot)
        {
            System.out.println("############## setDocumentRoot");
            this.documentRoot = documentRoot;
        }

        @Override
        public void customize(ConfigurableEmbeddedServletContainerFactory factory)
        {
            if (getDocumentRoot() != null)
            {
                factory.setDocumentRoot(new File(getDocumentRoot()));
            }
        }
    }
}

そして、application.properties に次の行を追加しました。

sample.server.documentRoot: someDirectoryName

...そしてそれはうまくいきます!

「############## setDocumentRoot」がコンソールに出力され、ドキュメント ルートが実際に設定されます。

それで、今は幸せですが、これは正しい方法ですか?

4

3 に答える 3

7

現時点で元の質問に対する最も正しい答えは、単一の場所に完全なリストがない (技術的にありえない) ということです。できる限り多くのことを文書化することができますし、そうするつもりです (時間が許す限り - 貢献を歓迎します)。ユーザー ガイドには、完全ではなく不正確な可能性のあるリストを含む、手動で精選されたプロパティのリストがあります。決定的なリストは、@ConfigurationProperties@Value注釈のソース コードの検索、およびRelaxedEnvironment(ここを参照) の時折の使用から得られます。ハウツー ドキュメントには、いくつかの一般的なアドバイスもあります。

于 2013-11-19T15:42:35.520 に答える
0

あなたの質問は非常に適切です。ajp 構成 ( http://www.appsdev.is.ed.ac.uk/blog/?p=525 )を探していたときに、別のより簡単なソリューションを見つけました。

application.properties で設定:

tomcat.server.document-root=/your/document/root/

あなたのアプリケーションクラスで:

1) @Value アノテーションを使用してプロパティを配置します

@Value("${tomcat.server.document-root}")
String documentRoot;

2) Bean を追加します。

@Bean
public EmbeddedServletContainerFactory servletContainer() {

    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();

    if (StringUtils.isNotBlank(documentRoot)) {
        tomcat.setDocumentRoot(new File(documentRoot));
    }

    return tomcat;
}

あなたは終わった!

于 2016-03-05T18:46:02.510 に答える