可用于应用程序的属性列表,是否在Spring Boot中使用属性?

x6yk4ghg  于 2022-09-18  发布在  Spring
关注(0)|答案(1)|浏览(160)

Spring Boot文档说,我们可以在Applation.Properties文件中设置属性。
但我找不到列出可以设置的可用属性的文档。
我在哪里可以找到这样的文件?

例如,我想为嵌入式Servlet设置DocentRoot。
我发现setDocumentRoot()方法是在AbstractEmbeddedServletContainerFactory.java中实现的。
但我不知道何时何地调用该方法,也不知道可以在Applation.Properties中设置的属性的名称。
我认为这应该很容易,因为Spring Boot的目的就是简化配置。

先谢谢你。

更新:

正如M.Deim建议的那样,我将‘server.Document-Root:omeDirectoryName’添加到了应用程序.Properties中,但出现了以下错误。

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=“服务器”,NORNOREUNKNOWNFIELS=False)’。因此,它管理以‘服务器’开头的应用程序属性,并且不允许未知的属性名称。
并且它不支持DocentRoot 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()));
            }
        }
    }
}

并将以下行添加到Applation.Properties中。

Sample.server.DocentRoot:某个目录名称

...它起作用了!

控制台打印#setDocumentRoot,实际设置了文档根。

所以,我现在很高兴,但这是正确的方式吗?

syqv5f0l

syqv5f0l1#

对最初问题最正确的答案是,在一个地方没有(从技术上讲也不可能)有一个详尽的清单。我们可以并将尽可能多地记录下来(在时间允许的情况下--感激地接受捐款)。用户指南中有一个属性列表,对于Spring Boot本身支持的几乎所有内容都是准确的(但不是构建在它之上的其他库)。确定的列表来自于在源代码中搜索@ConfigurationProperties@Value注解。在操作文档中也有一些一般性的建议。

相关问题