title: SnakeYaml "Unable to find property error"
body: <p>Here is part of my config.yml:</p>
  
  <pre><code>#Authenctication
  AuthenticationConfig:
    AuthencticationType: LDAP
    LDAPConfig:
       LDAPUrl: ldap://localhost:389
       ConnectionType: simple
       LDAPSecurityConfig:
          RootDN: cn=manager,dc=maxcrc,dc=com
          RootPassword: secret
          UserSearchDN: ou=People,dc=maxcrc,dc=com
          GroupdSearchDB: ou=Groups,dc=maxcrc,dc=com
  </code></pre>
  
  <p>I have a class used for parsing:</p>
  
  <pre><code>public class YamlConfiguraiton {
      private AuthenticationConfiguration AuthenticationConfig;
  
      public void setAuthenticationConfig(AuthenticationConfiguration AuthenticationConfig) {
          this.AuthenticationConfig = AuthenticationConfig;
      }
  
      public AuthenticationConfiguration getAuthenticationConfig() {
          return this.AuthenticationConfig;
      }
  }
  </code></pre>
  
  <p>However, when I run </p>
  
  <pre><code>try(InputStream in = new FileInputStream(new File(ymalPath))) {
              yamlConfig = yaml.loadAs(in, YamlConfiguraiton.class);
          } catch (IOException e) {
              e.printStackTrace();
          }
  </code></pre>
  
  <p>the following error happens:</p>
  
  <pre><code>Exception in thread "main" Cannot create property=AuthenticationConfig for JavaBean=com.ibm.entity.matching.common.bootstrap.YamlConfiguraiton@e7860081
   in 'reader', line 2, column 1:
      AuthenticationConfig:
      ^
  Unable to find property 'AuthenticationConfig' on class: com.ibm.entity.matching.common.bootstrap.YamlConfiguraiton
   in 'reader', line 3, column 4:
         AuthencticationType: LDAP
         ^
  
      at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:270)
      at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:149)
      at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:309)
      at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:204)
      at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:193)
      at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:159)
      at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:146)
      at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:524)
      at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:518)
      at com.ibm.entity.matching.bootstrap.EntityMatching.boot(EntityMatching.java:55)
      at com.ibm.entity.matching.bootstrap.EntityMatching.main(EntityMatching.java:35)
  Caused by: org.yaml.snakeyaml.error.YAMLException: Unable to find property 'AuthenticationConfig' on class: com.ibm.entity.matching.common.bootstrap.YamlConfiguraiton
      at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:159)
      at org.yaml.snakeyaml.introspector.PropertyUtils.getProperty(PropertyUtils.java:148)
      at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.getProperty(Constructor.java:287)
      at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.constructJavaBean2ndStep(Constructor.java:208)
      ... 10 more
  </code></pre>
  
  <p>Why it complains about cannot finding property AuthenticationConfig while AuthenticationConfig is just the name of the instance variable? </p>
  
  <p><strong>UPDATE</strong>
  After I changed the instance variables from "private" to "public", they were recognized by SnakeYaml, but this is not what we expect for sure. The classes are not recognized as JavaBean.</p>
  
  <p><strong>UPDATE</strong>
  I found the root cause. It is the naming convention. If you want SnakeYaml to parse your yaml file, camelCase has to be complied with. The name of setter and getter method is also important. Say there is a private instance variable called ldapConfig, then its getter and setter's name has to be getLdapConfig and setLdapConfig, even getLDAPConfig and setLDAPConfig won't work.</p>