对我来说,例如内容协商机制。从。Brixton.RC1
和Brixton.RC2
切换到Spring Cloud Angel.SR5
或Angel.SR6
后,for .properties无法在Spring Cloud Config Server中运行。
使用gradlew bootRun
或java -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'
}
Spring Cloud Config Server
ConfigServerMvcConfiguration
是否有任何明显的配置错误自己提供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");
}
}
有人可以复制此问题或向我提供有关如何解决此问题的任何指导吗?
答案 0 :(得分:3)
在写下这个问题之后,我意识到:我正在寻找鬼魂。 在检查我自己编写的集成测试时,我发现,我试图使用错误的url架构访问属性。
我试图使用网址
访问这些属性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作为当前支持的格式。
再次出现一个可能使事情复杂化的小错误。