SnakeYaml 错误 无法创建属性错误

huangapple go评论182阅读模式
英文:

SnakeYaml error cannot create property error

问题

以下是您提供的代码和错误信息的翻译部分:

我正在尝试使用SnakeYaml读取和写入YAML文件
以下是代码

public class SnakeYaml {

    public static void main(String[] args) throws FileNotFoundException {
        // TODO Auto-generated method stub

        InputStream inputStream = new FileInputStream(new File("C:\\yaml\\student.yaml"));

        Representer representer = new Representer();
        representer.getPropertyUtils().setSkipMissingProperties(true);

        Yaml yaml = new Yaml(new Constructor(Values.class), representer);

        Values data = yaml.load(inputStream);
        System.out.println(data);

    }
}

public class Values {

    private List<Image> image;
    private String id;
    private String name;
    private String year;
    private String address;
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    private String department;


    public Values() {

    }

    public Values(List<Image> image, String id, String name, String year, String address, String department) {
        super();
        this.image = image;
        this.id = id;
        this.name = name;
        this.year = year;
        this.address = address;
        this.department = department;

    }

    public List<Image> getImage() {
        return image;
    }

    public void setImage(List<Image> image) {
        this.image = image;
    }
}

public class Image {

    private String repository;
    private String pullPolicy;
    private String tag;

    public Image() {

    }

    public Image(String repository, String pullPolicy, String tags) {
        super();
        this.repository = repository;
        this.pullPolicy = pullPolicy;
        this.tag = tags;

    }

    public String getRepository() {
        return repository;
    }
    public void setRepository(String repository) {
        this.repository = repository;
    }
    public String getPullPolicy() {
        return pullPolicy;
    }
    public void setPullPolicy(String pullPolicy) {
        this.pullPolicy = pullPolicy;
    }
    public String getTag() {
        return tag;
    }
    public void setTag(String tag) {
        this.tag = tag;
    }


}

YAML文件如下:

id: "20"
name: "Bruce"
year: "2020"
address: "Gotham City"
department: "Computer Science"
image:
  repository: "test.abc.com/test"
  pullPolicy: "IfNotPresent"
  tag: "xyz"

以下是错误信息的翻译:

> 在线程"main"中出现异常,无法为JavaBean=oe.kubeapi.abc.Values@1372ed45创建属性=image,位于'reader'中,第1行,第1列:
>     id: "20"
>     ^ 在'reader'中找不到类oe.kubeapi.abc.Image的单参数构造函数,位于第7行,第3列:
>       repository: "test.abc.com/test ...
>       ^
> 不确定缺少哪个属性,请提供建议

请注意,您的错误消息指出在YAML文件中的image部分缺少属性,因此需要确保Image类具有与YAML文件中的字段相对应的属性和构造函数。

英文:

I'm trying to read and write the yaml file using SnakeYaml.
here is the code :

public class SnakeYaml {

	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
		
		InputStream inputStream = new FileInputStream(new File(&quot;C:\\yaml\\student.yaml&quot;));
	
		Representer representer = new Representer();
		 representer.getPropertyUtils().setSkipMissingProperties(true);

		Yaml yaml = new Yaml(new Constructor(Values.class),representer);
	//	Map&lt;String, Object&gt; data = yaml.load(inputStream);
		
		Values data = yaml.load(inputStream);
		System.out.println(data);

	}
}

public class Values {
	
	 private List&lt;Image&gt; image;
	 private String id;
	 private String name;
	 private String year;
	 private String address;
	 public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getDepartment() {
		return department;
	}

	public void setDepartment(String department) {
		this.department = department;
	}

	private String department;
	 
	 
	 public Values()
	 {
		 
	 }
	 
	 public Values (List&lt;Image&gt; image, String id, String name, String year, String address, String department )
	 {
		 super ();
		 this.image = image;
		 this.id = id;
		 this.name = name;
		 this.year = year;
		 this.address = address;
		 this.department = department;
		 
		 
	 }

	public List&lt;Image&gt; getImage() {
		return image;
	}

	public void setImage(List&lt;Image&gt; image) {
		this.image = image;
	}
}


public class Image {
	
	private String repository;
	private String pullPolicy;
	private String tag;
	
	public Image()
	{
		
	}
	
	public Image (String repository, String pullPolicy, String tags)
	{
		super();
		this.repository = repository;
		this.pullPolicy = pullPolicy;
		this.tag = tags;
		
	}
	
	public String getRepository() {
		return repository;
	}
	public void setRepository(String repository) {
		this.repository = repository;
	}
	public String getPullPolicy() {
		return pullPolicy;
	}
	public void setPullPolicy(String pullPolicy) {
		this.pullPolicy = pullPolicy;
	}
	public String getTag() {
		return tag;
	}
	public void setTag(String tag) {
		this.tag = tag;
	}
	

}

The yaml file is as below :

id: &quot;20&quot;
name: &quot;Bruce&quot;
year: &quot;2020&quot;
address: &quot;Gotham City&quot;
department: &quot;Computer Science&quot;
image:
  repository: &quot;test.abc.com/test&quot;
  pullPolicy: &quot;IfNotPresent&quot;
  tag: &quot;xyz&quot;

getting below error

> Exception in thread "main" Cannot create property=image for
> JavaBean=oe.kubeapi.abc.Values@1372ed45 in 'reader', line
> 1, column 1:
> id: "20"
> ^ No single argument constructor found for class oe.kubeapi.abc.Image in 'reader', line 7, column 3:
> repository: "test.abc.com/test ...
> ^

not sure which property is missing . please suggest

答案1

得分: 1

问题在于您如何构造了yaml文件。Values 类中 image 属性的类型是 List&lt;Image&gt;

public class Values {
    private List&lt;Image&gt; image;
    // setter &amp; getters &amp; constructors
}

如果您的 yaml 文件如下所示:

id: &quot;20&quot;
name: &quot;Bruce&quot;
year: &quot;2020&quot;
address: &quot;Gotham City&quot;
department: &quot;Computer Science&quot;
image:
  repository: &quot;test.abc.com/test&quot;
  pullPolicy: &quot;IfNotPresent&quot;
  tag: &quot;xyz&quot;

那么您在说 image 属性是一个具有三个属性(repositorypullPolicytag)的对象。您还可以将其视为具有三个键值对的字典,而不是列表。

有不同的方法来处理它,所有这些方法都在yaml规范中有记录。

[
  { repository: &quot;test.abc.com/test1&quot;, pullPolicy: &quot;IfNotPresent1&quot;, tag: &quot;xyz1&quot; },
  { repository: &quot;test.abc.com/test2&quot;, pullPolicy: &quot;IfNotPresent2&quot;, tag: &quot;xyz2&quot; }
]
image:
  - { repository: &quot;test.abc.com/test1&quot;, pullPolicy: &quot;IfNotPresent1&quot;, tag: &quot;xyz1&quot; }
  - { repository: &quot;test.abc.com/test2&quot;, pullPolicy: &quot;IfNotPresent2&quot;, tag: &quot;xyz2&quot; }
image:
  - repository: &quot;test.abc.com/test1&quot;
    pullPolicy: &quot;IfNotPresent1&quot;
    tag: &quot;xyz1&quot;
  - repository: &quot;test.abc.com/test2&quot;
    pullPolicy: &quot;IfNotPresent2&quot;
    tag: &quot;xyz2&quot;

如果您将以下行添加到您的 main 方法中:

Values data = yaml.load(inputStream);
data.getImage().forEach(x -&gt; System.out.println(x.getTag()));

您将看到 Image 类的 tag 属性在所有情况下都被打印出来。

英文:

The problem is how you structured the yaml file. The type of image attribute in class Value is a List&lt;Image&gt;.

public class Values {
    private List&lt;Image&gt; image;
    // setter &amp; getters &amp; constructors
}

with your yaml file like

id: &quot;20&quot;
name: &quot;Bruce&quot;
year: &quot;2020&quot;
address: &quot;Gotham City&quot;
department: &quot;Computer Science&quot;
image:
  repository: &quot;test.abc.com/test&quot;
  pullPolicy: &quot;IfNotPresent&quot;
  tag: &quot;xyz&quot;

you are saying that image property is an object with three attributes (repository, pullPolicy, tag). You could also consider it as a dictionary with three key-value pairs, but not a list.

There are different ways of doing it. All of them are documented in the spec of yaml

  [
    { repository: &quot;test.abc.com/test1&quot;, pullPolicy: &quot;IfNotPresent1&quot;, tag: &quot;xyz1&quot; },
    { repository: &quot;test.abc.com/test2&quot;, pullPolicy: &quot;IfNotPresent2&quot;, tag: &quot;xyz2&quot; }
  ]
image:
  - { repository: &quot;test.abc.com/test1&quot;, pullPolicy: &quot;IfNotPresent1&quot;, tag: &quot;xyz1&quot; }
  - { repository: &quot;test.abc.com/test2&quot;, pullPolicy: &quot;IfNotPresent2&quot;, tag: &quot;xyz2&quot; }
image:
  - repository: &quot;test.abc.com/test1&quot;
    pullPolicy: &quot;IfNotPresent1&quot;
    tag: &quot;xyz1&quot;
  - repository: &quot;test.abc.com/test2&quot;
    pullPolicy: &quot;IfNotPresent2&quot;
    tag: &quot;xyz2&quot;

if you add the following lines to your main method

Values data = yaml.load(inputStream);
data.getImage().forEach(x -&gt; System.out.println(x.getTag()));

you will see that the attribute tag from Image class is being printed in all the cases

huangapple
  • 本文由 发表于 2023年5月28日 22:27:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/76351978.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定