Bean @Property injection
synclpz Aug 27, 2013 10:50 AMImagine we have a bean implementation which involves property usage, specified in switchyard.xml component/composite properties.
It looks like this at the moment:
@Service(SomeService.class)
public class SomeServiceImpl implements SomeService {
     @Property(name = "string-property")
     String stringProperty;
     @Property(name = "int-property")
     String intProperty; //could be only String, but is integer semantically!
     public void someServiceMethod() {
          // there we should do
          int intPropValue = 0;
         try {
               intPropValue = Integer.parseInt(intProperty);
          } catch (Throwable t) {
               intPropValue = SOME_DEFAULT_FOR_EXAMPLE;
          }
     }
}
This is not a good way, because properties are set only while deployment, but should be parsed (integer is simple examle, but there could be more complex) any time service is invoked.
I tried to achieve reading properties upon deployment via @PostConstruct
@Service(SomeService.class)
public class SomeServiceImpl implements SomeService {
     @Property(name = "string-property")
     String stringProperty;
     @Property(name = "int-property")
     String intProperty; //could be only String, but is integer semantically!
     int intPropValue;
     
     @PostConstruct
     void init() {
         try {
               intPropValue = Integer.parseInt(intProperty);
          } catch (Throwable t) {
               intPropValue = SOME_DEFAULT_FOR_EXAMPLE;
          }
     }
     public void someServiceMethod() {
          //just use intPropValue
     }
}
But no success, because it seems like they are injected after @PostConstruct.
So, the questions are:
1. Why not inject properties before @PostConstruct? They are not changing while bean is being invoked.
2. Are there any methods of extracting implementation configuration parameters anywhere but properties supported internally in SY?
Now I resolve this issue by using code:
@Service(SomeService.class)
public class SomeServiceImpl implements SomeService {
     @Property(name = "string-property")
     String stringProperty;
     @Property(name = "int-property")
     String intProperty; //could be only String, but is integer semantically!
   
  int intPropValue;
   
  private boolean init = false;
   
  private void init() {     
         try {
               intPropValue = Integer.parseInt(intProperty);
          } catch (Throwable t) {
               intPropValue = SOME_DEFAULT_FOR_EXAMPLE;
          }
        init = true;
  }
     public void someServiceMethod() {
      if (!init) {
            init()
       }
     }
}