spring cloud config-server .properties内容协商失败

时间:2016-04-20 09:02:57

标签: spring-mvc spring-boot spring-cloud spring-cloud-config

对我来说,例如内容协商机制。从。Brixton.RC1Brixton.RC2切换到Spring Cloud Angel.SR5Angel.SR6后,for .properties无法在Spring Cloud Config Server中运行。

使用gradlew bootRunjava -jar ...启动服务时出现问题。它虽然在我的集成测试中工作(参见下面的 Working Integration-Test )。

使用场景:

我想访问应用testing的个人资料my-service中的配置,因此我正在呼叫http://localhost:8888/my-service/testing.properties

预期结果:

some.property=1234
some.other.property=hello there

实际结果:

没有Accept - 标题:

<!DOCTYPE html>
<html>
    <head>
        <title>Error 406</title>
    </head>
    <body>
        <h1>Error 406: Not Acceptable</h1>
        <br/>
        Could not find acceptable representation
    </body>
</html>

使用Accept - 标题application/json

{
    "timestamp": 1461140158009,
    "status": 406,
    "error": "Not Acceptable",
    "exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
    "message": "Could not find acceptable representation",
    "path": "/config/my-service/default.properties"
}

从示例中可以看出,内容协商机制似乎正在进行错误处理,但对于配置访问则不然。

工作集成 - 测试:

我写了以下Spock-Test

@WebIntegrationTest({"server.port=0", "management.port=0"})
@ActiveProfiles("testing")
@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = ConfigurationServiceApplication.class)
class ConfigurationAccessTest extends Specification {

    @Autowired
    TestserverInfo testserverInfo

    def "testing profile returns testing properties"() {
        given:
        RestTemplate rest = new TestRestTemplate(null, null)
        Properties properties = new Properties()

        when:
        String result = rest.getForObject( testserverInfo.getBasePath() + "/my-service-testing.properties", String.class );
        properties.load( new StringReader(result) )

        then:
        properties['test'] == 'Testing Profile World'
        properties['my.long.testing.property'] == 'Testing Profile Property'
    }

到目前为止我已经做过的事情:

  1. 在所有注明版本的Spring Cloud Config Server
  2. 中针对正在运行的情况写了上述Spock-Test
  3. 根据我对Spring MVC内容协商的了解,检查ConfigServerMvcConfiguration是否有任何明显的配置错误
  4. 自己提供WebMvcConfigurer并初始化内容协商,如上面引用的配置类:

    @EnableWebMvc
    @Configuration
    public class ConfigMvcConfiguration extends WebMvcConfigurerAdapter {
        private final Logger logger =  LoggerFactory.getLogger(ConfigMvcConfiguration.class);
    
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.mediaType("properties", MediaType.valueOf("text/plain"));
            configurer.mediaType("yml", MediaType.valueOf("text/yaml"));
            configurer.mediaType("yaml", MediaType.valueOf("text/yaml"));
            logger.info("media-types added");
        }
    }
    
  5. 有人可以复制此问题或向我提供有关如何解决此问题的任何指导吗?

1 个答案:

答案 0 :(得分:3)

在写下这个问题之后,我意识到:我正在寻找鬼魂。 在检查我自己编写的集成测试时,我发现,我试图使用错误的url架构访问属性。

TLDR

我试图使用网址

访问这些属性
http://localhost:8888/config/my-service/testing.properties   <-- wrong
rather than
http://localhost:8888/config/my-service-testing.properties   <-- correct

详细信息

可以使用以下url架构(不使用标签时)以JSON格式访问属性:

http://<host>:<port>/<contextPath>/<application>/<profile>

如果想要以json以外的格式访问属性,她必须使用另一个url-schema(再次没有标签的示例)

http://<host>:<port>/<contextPath>/<application>-<profile>.<format>

格式化beeing属性/ yml / yaml作为当前支持的格式。

再次出现一个可能使事情复杂化的小错误。