我想从yaml文件(application.yml)中读取一个主机列表,该文件如下所示:
cors:
hosts:
allow:
- http://foo1/
- http://foo2/
- http://foo3/
(例1)
我使用的类定义了这样的值:
@Value("${cors.hosts.allow}")
List<String> allowedHosts;
但是,当Spring抱怨这一点时,阅读失败了:
java.lang.IllegalArgumentException:无法解析占位符 &#39; cors.hosts.allow&#39;在字符串值&#34; $ {cors.hosts.allow}&#34;
当我像这样更改文件时,可以读取属性,但自然它不包含列表但只包含一个条目:
cors:
hosts:
allow: http://foo1, http://foo2, http://foo3
(我知道我可以将这些值作为一行读取并按","
分割,但我不想再找一个解决方法了)
这也不起作用(虽然我认为根据snakeyamls docs这应该是有效的):
cors:
hosts:
allow: !!seq [ "http://foo1", "http://foo2" ]
(跳过!!seq
并仅使用[
/ ]
也是失败的)
我阅读了here的建议,其中涉及使用@ConfigurationProperties
并将示例转移到Java并将其与您在Example1中看到的yaml文件一起使用:
@Configuration
@EnableWebMvc
@ConfigurationProperties(prefix = "cors.hosts")
public class CorsConfiguration extends WebMvcConfigurerAdapter {
@NotNull
public List<String> allow;
...
当我这样做时,我得到了这个抱怨:
org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder $ RelaxedBeanPropertyBindingResult: 1个错误对象&#39; cors.hosts&#39;中的字段错误在现场&#39;允许&#39;:拒绝 值[null];代码[NotNull.cors.hosts.allow,NotNull.allow,NotNull]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码[cors.hosts.allow,允许];争论者[];默认消息 [允许]];
我搜索了其他方法让我的CORS主机可配置并找到Spring Boot issue,但由于尚未完成,我无法将其用作解决方案。 所有这些都是通过Spring Boot 1.3 RC1完成的。
答案 0 :(得分:3)
所以,你有这样一个yaml:
-(BOOL)deleteElementWithHead:(ListNode*)headNode andNodeToDelete:(ListNode*)deleteNode{
if (!head || !deleteNode) {
return FALSE;
}
ListNode *element = head;
if (deleteNode == head) {
ListNode *temp;
temp = element.next;
head = nil;
head = temp;
return TRUE;
}
while (element) {
if (element.next == deleteNode) {
element.next = deleteNode.next;//set the pointer for element to the node to delete's "next" property so it points to the next one in the list
deleteNode = nil;
return TRUE;
}
element = element.next;
}
return FALSE;
}
然后首先绑定数据
cors:
hosts:
allow:
- http://foo1/
- http://foo2/
- http://foo3/
然后在另一个组件中你做
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties(prefix="cors.hosts")
public class AllowedHosts {
private List<String> HostNames; //You can also bind more type-safe objects
}
你完成了!
答案 1 :(得分:3)
在application.yml中使用逗号分隔值
corsHostsAllow: http://foo1/, http://foo2/, http://foo3/
用于访问的java代码
@Value("${corsHostsAllow}")
String[] corsHostsAllow
我尝试过并且成功了;)
答案 2 :(得分:1)
我已经能够从以下方式读取列表 -
属性 -
cors.hosts.allow[0]=host-0
cors.hosts.allow[1]=host-1
阅读资产 -
@ConfigurationProperties("cors.hosts")
public class ReadProperties {
private List<String> allow;
public List<String> getAllow() {
return allow;
}
public void setAllow(List<String> allow) {
this.allow = allow;
}
}
答案 3 :(得分:0)
我遇到了同样的问题,但是解决了,给我我的解决方法
exclude-url: >
/management/logout,
/management/user/login,
/partner/logout,
/partner/user/login
Spring boot 2.1.6.RELEASE版本中的成功