RussellSpitzer/snakeyaml

Cannot create property bug for subclass add set method for property

GoogleCodeExporter opened this issue · 12 comments




import org.yaml.snakeyaml.Yaml;

public class TestYaml {

    public static abstract class BeanA {

       public abstract Object getId();

    }

    public static class BeanA1 extends BeanA {

        private Long id;

       // @Override
        public Long getId() {
            return id;
        }


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

        private String name;

        public String getName() {
            return name;
        }

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

    }

    public static void main(String[] args) {

        System.out.println("test...");
        BeanA1 b = new BeanA1();
       b.setId(2l);
       b.setName("name1");
       Yaml yaml = new Yaml();
        String dump = yaml.dump(b);

       System.out.println("dump:"+dump);

       yaml.load(dump);

       dump = "!!scripts.spring.TestYaml$BeanA1 {id: 2, name: name1}";

       yaml.load(dump); //BUG:Caused by: org.yaml.snakeyaml.error.YAMLException: Unable to find propert
    }
}

Original issue reported on code.google.com by qxodr...@gmail.com on 3 Jun 2014 at 8:26

What does the 'dump' variable contain before the re-assignment ?

Original comment by py4fun@gmail.com on 3 Jun 2014 at 1:00

[deleted comment]
The provided code works as expected.

Original comment by py4fun@gmail.com on 4 Jun 2014 at 6:26

  • Changed state: Invalid

why the exception is ok ?  

Caused by: org.yaml.snakeyaml.error.YAMLException: Unable to find property 'id' 
on class: TestYaml$BeanA1



import org.yaml.snakeyaml.Yaml;

public class TestYaml {

    public static abstract class BeanA {

       public abstract Object getId();

    }

    public static class BeanA1 extends BeanA {

        private Long id;

         public Long getId() {
            return id;
        }


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

        private String name;

        public String getName() {
            return name;
        }

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

    }

    public static void main(String[] args) {

        System.out.println("test...");
        BeanA1 b = new BeanA1();
       b.setId(2l);
       b.setName("name1");
       Yaml yaml = new Yaml();
        String dump = yaml.dump(b);

       System.out.println("dump:"+dump);

       yaml.load(dump);

       dump = "!!TestYaml$BeanA1 {id: 2, name: name1}"; //BUG : Unable to find property 'id' on class: TestYaml$BeanA1


       yaml.load(dump);
    }
}

Original comment by qxodr...@gmail.com on 5 Jun 2014 at 2:06

1) the code you have given works without exceptions
2) please read the question above and give the answer - what is the contents of 
the 'dump' variable before it has been re-assigned
3) what is the SnakeYAML version ?
4) what is the Java version ?
5) to show that your code works without exceptions, tests have been added:
https://code.google.com/p/snakeyaml/source/list

You can see the code here:
https://code.google.com/p/snakeyaml/source/browse/src/test/java/org/yaml/snakeya
ml/issues/issue193/TestYaml.java

Feel free to take the source code and change it in a way it fails.

Original comment by py4fun@gmail.com on 5 Jun 2014 at 8:11

Apple 1.6.0_43 ... _60 fails as well.

I think this in related to https://bugs.openjdk.java.net/browse/JDK-6794807 
which is duplicates https://bugs.openjdk.java.net/browse/JDK-6528714 which was 
not back-ported to Java 6.

I am not even sure we can fix it.

At the moment you can use BeanAccess.FIELD if you you can accept direct field 
access for all SnakeYAML processed classes (ignoring setters and getters) :

{{{
Yaml yaml = new Yaml();
yaml.setBeanAccess(BeanAccess.FIELD);
}}}

or you can use BeanAccess.FIELD only for some classes :

{{{
Constructor c = new Constructor();
Representer r = new Representer();

PropertyUtils pu = new PropertyUtils();
c.setPropertyUtils(pu);
r.setPropertyUtils(pu);

pu.getProperties(BeanA1.class, BeanAccess.FIELD);

Yaml yaml = new Yaml(c, r);
}}}

If you need even more control on Bean's properties, you can try my clone. But 
at the moment it is a bit out of sync with the master and not yet finalized ;)

Original comment by alexande...@gmail.com on 6 Jun 2014 at 7:53

Alex, since you have the best picture of the problem feel free to contribute.
(you may also close it with "WontFix" given the detailed description)

Original comment by py4fun@gmail.com on 6 Jun 2014 at 8:21

  • Changed state: Accepted
[deleted comment]
[deleted comment]
WontFix: see comment 8

Original comment by alexande...@gmail.com on 29 Aug 2014 at 12:11

It's jvm problem:(

test SnakeYAML version(1.12 and 1.13)

on oracle(sun) jvm (jdk1.6.0_45) not work,but on oracle jvm(1.7,1.8) work
fine

on IBM jvm 1.5:build pwi32devifx-20100127 (SR11 FP1 ) not work,but on IBM
jvm 1.6 work fine





2014-06-05 16:11 GMT+08:00 <snakeyaml@googlecode.com>:

Original comment by qxodr...@gmail.com on 6 Jun 2014 at 3:41

Well, Oracle JVM 1.6 is supported. 
I will try to reproduce the issue.

Original comment by py4fun@gmail.com on 6 Jun 2014 at 4:56

  • Changed state: New