OK, that’s pretty straightforward.

Annotations (@interface) can not return null values from their members. This is 
a java language thing, not a DS thing.  You need to assure either that your 
configuration has an appropriate value or specify a default in the annotation.  
You only get notified of the problem when you try to access the member.

Alternatively, you can use a felix extension allowing you to configure with an 
interface, in which case null returns are allowed.  You could define your 
defaults directly in the @Component annotation property member.  To do this 
investigate the DSExt annotations in the org.apache.felix.scr.ext.anno bundle. 
You’d use @DSExt.ConfigureWithInterfaces.

Hope this helps
david jencks

> On Sep 6, 2016, at 2:08 PM, Leschke, Scott <[email protected]> wrote:
> 
> Yes, this is a DS component.
>  
> @Component(
>        configurationPid    = "medline.bam.metric.provider.query",
>        configurationPolicy = ConfigurationPolicy.REQUIRE,
>        immediate           = true
> )
> @Designate(ocd = QueryProviderConfig.class)
> public class QueryProvider
>  
> Configuration Property Type: Name per 
> http://njbartlett.name/2015/08/17/osgir6-declarative-services.html 
> <http://njbartlett.name/2015/08/17/osgir6-declarative-services.html>
>  
> The CFP is the following:
>  
> @ObjectClassDefinition(name = "BAM Query Metric Provider Configuration")
> @interface QueryProviderConfig
> {
>        String system();
>        String path();
>        int           frequency()          default 60;
>        Status status()                   default Status.Requested;
>        boolean       postable()           default false;
>  
>        RuleType      ruleType();
>        String        ruleDef()      default "";
>  
>        ProviderType         providerType();
>        String               dataSource();
>        String               queryFile();
>        String[]             queryMods()          default {};
>        String               nameColumn()      default "";
>        String               valueColumn();
>        ValueColumnType      valueColumnType() default ValueColumnType.INT;
> }
>  
> The exception occurs within the Activator when the method ruleType() of the 
> CFP is invoked.
> I hesitate to post the code as it’s a bit more complicated but that’s the 
> upshot. My gut is telling me that since RuleType is an enum, it can’t be 
> null, although that make sense in this case.  I can test it of course, by 
> adding “None” to the RuleType enum and setting the default to that but I’d 
> prefer not to unless that’s the expected approach.
>  
> From: David Jencks [mailto:[email protected]] 
> Sent: Tuesday, September 06, 2016 2:48 PM
> To: [email protected]
> Subject: Re: configuration property types and enums
>  
> I have some guesses about what you might be talking about but it doesn’t all 
> make sense yet.This is a DS component, right?  Could you be a lot more 
> specific, showing at least the activate method signature, whatever you mean 
> by  configuration property type, the enum, and the stack trace?  If you’ve 
> used any extra annotations on the component please show them too.
>  
> thanks
> david jencks
>  
> On Sep 6, 2016, at 11:52 AM, Leschke, Scott <[email protected] 
> <mailto:[email protected]>> wrote:
>  
> I’m getting the following exception from an activate method.
>  
> org.osgi.service.component.ComponentException: 
> java.lang.IllegalArgumentException: No enum constant (Enumeration type name).
>  
> The activate method takes a Configuration Property Type that has a method 
> that returns a value of the type but does NOT have a default defined. The 
> activate method checks to see the method returns null. This is what I want 
> but it seems like it’s demanding that the Enum be non-null. Am I reading this 
> correctly?  Must CFPs that return enums always return a valid value for the 
> type?
>  
> Scott

Reply via email to