Reading from the applciation.properties file -Springboot

Hi,

In my bpmn step, I have a service task. I have to read the url of this service task from the spring boot application.properties. I am not able to do that.

Springboot application.properties.
serviceURL=testurl

Java Deligate has the code
@Value(“${serviceURL}”)
private String url;

Java Deligate has the annotation @Service. Am I missing anything here?

Regards,
Subbu

Hi @subbu,

how do you provide properties to your context? Is there placeholderConfigurer declared?

Cheers,
Askar

Hi @aakhmero,
I did not quite get the question. Based on my understanding, I am using application.properties that is used as default by spring to read the variables. I am using @Value annotation in the normal way that we use in spring application within my Java Delegate.

Problem I see here is the java delegate initialization is happening by Camunda not by Sping. Is there anything more that I need to do?

I am using these lines to read the value from property files
@Value("${serviceURL}")
private String url;

serviceURL is the property defined in application.properties.

Regards,
Subbu

Hi @subbu,

it sounds to me like you need to read a bit about how spring is working first. Something like http://www.baeldung.com/properties-with-spring should help you.

I would suggest to declare PropertyPlaceholderConfigurer after that to figure out if then the problem is resolved.

Cheers,
Askar.

Hi @aakhmerov,
Thanks for the quick reply.
As I am using spring boot, from the post that you shared

“Boot applies it’s typical convention over configuration approach to property files. This means that we can simply put an “application.properties” file in our “src/main/resources” directory, and it will be auto-detected. We can then inject any loaded properties from it as normal.”
“So, by using this default file, we don’t have to explicitly register a PropertySource, or even provide a path to a property file.”

I have other set of properties that I am able to read from the same properties file from My spring Rest controllers. Problem is with the Java Delegate. Here Spring injection is not getting recognized. Hope the life cycle of this is not in the control of Spring. Not sure…

Regards,
Subbu

Hi @sobbu,

does DI work if you just use @Autowired inside of your delegate to autowire some other bean?
could you show me how you configured your application? Your pom.xml and spring configurations would be interesting to see.

Cheers,
Askar

@aakhmerov

Here is the code for Java delegate
@Component(“TestServiceImpl”)
public class TestServiceImpl implements JavaDelegate {

private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImpl.class);

@Value("${serviceURL}")
private String url;

@PostConstruct
public void initIt() throws Exception {
	LOGGER.debug("url in post conturuct is --------->:"+url);
}

@Override
public void execute(DelegateExecution execution) throws Exception {
	LOGGER.debug("url is --------->:"+url);
	.............
}

}

When I run the spring boot app, I can see the log statement, "url in post conturuct is " with a right value for the url.

So my assumption of not able to read the variable was wrong. I can see that in the postconstruct method.
Problem is I am not able to get the value in execute method.

Regards,
Subbu

Hi @sobbu,

is there a setter method defined for your url private member?

Cheers,
Askar

Did you use a bean reference in die BPMN to reference your delegate class? If you only use the class name the Delegate instance will be created by camunda on the fly (I guess) without consideration of the application.properties.
Spring neverthless might instantiate an instance of your delegate because you annotated it with @Service - but this instance will probably not be used.

1 Like

Hi @FrVaBe,
You are right. Camunda is not considering my application.properties.
Instance creation is happening on the fly.
They way I referenced the Java delegate is as “Java class” in BPMN.

How should I refer this Java Implementation so that my application.properties will be accessible on execute method of the java delegate?

Regards,
Subbu

You have to use a delegate Expression like explained here (notation ${myDelegateBean}). Not 100% sure how to give your service the name - I think you can use the @Qualifier annotation (or maybe the @Service(“myDelegateBean”) is already enough).

2 Likes

Hi @subbu,

you should probably read through this guide https://docs.camunda.org/manual/7.6/user-guide/process-engine/delegation-code/#field-injection.

Since your bean is annotated with name @Component("TestServiceImpl"), you should be able to use ${TestServiceImpl}.

Cheers,
Askar

@FrVaBe and @aakhmerov,

Thank you very much. Delegate Expression worked.

Regards,
Subbu

Hey Subbu,

I am facing the same issue. Do you mind sharing how did you resolve it? My settings are identical to yours. I think, I am missing an annotation.

Thanks,

Hey @aakhmerov,
Since my class is implementing Java Delegate, and when I add @Component annotation on top of my service class, I am getting this error,

 org.camunda.commons.logging.BaseLogger.logError ENGINE-16004 Exception while closing command context: Unknown property used in expression: ${EventService}. Cause: Cannot resolve identifier 'EventService'
 org.camunda.bpm.engine.ProcessEngineException: Unknown property used in expression: ${EventService}. Cause: Cannot resolve identifier 'EventService'
        at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:62)
        at org.camunda.bpm.engine.impl.el.JuelExpression.getValue(JuelExpression.java:50)
        at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior$3.call(ServiceTaskDelegateExpressionActivityBehavior.java:106)
        at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior$3.call(ServiceTaskDelegateExpressionActivityBehavior.java:101)
        at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior.executeWithErrorPropagation(AbstractBpmnActivityBehavior.java:110)
        at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior.performExecution(ServiceTaskDelegateExpressionActivityBehavior.java:126)
        at org.camunda.bpm.engine.impl.bpmn.behavior.TaskActivityBehavior.execute(TaskActivityBehavior.java:68)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:60)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute$2.callback(PvmAtomicOperationActivityExecute.java:49)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueIfExecutionDoesNotAffectNextOperation(PvmExecutionImpl.java:1988)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:41)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:30)
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:95)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:127)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:107)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:82)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:640)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:614)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:1927)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl$6.callback(PvmExecutionImpl.java:1924)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.continueExecutionIfNotCanceled(PvmExecutionImpl.java:1994)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:1943)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.dispatchDelayedEventsAndPerformOperation(PvmExecutionImpl.java:1924)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:60)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTransitionNotifyListenerStart.java:30)
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:67)
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:95)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:127)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:107)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:82)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:72)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:649)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:624)
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:60)
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:95)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:127)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:107)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:82)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:72)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:649)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:624)
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:60)
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:95)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:127)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:107)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:82)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:72)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:649)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:624)
        at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:60)
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:95)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:127)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:107)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:82)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:640)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:614)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationTransitionCreateScope.scopeCreated(PvmAtomicOperationTransitionCreateScope.java:37)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:53)
        at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationCreateScope.execute(PvmAtomicOperationCreateScope.java:27)
        at org.camunda.bpm.engine.impl.interceptor.AtomicOperationInvocation.execute(AtomicOperationInvocation.java:95)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.invokeNext(CommandInvocationContext.java:127)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performNext(CommandInvocationContext.java:114)
        at org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.performOperation(CommandInvocationContext.java:82)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:640)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:614)
        at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.start(PvmExecutionImpl.java:246)
        at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.start(ExecutionEntity.java:449)
        at org.camunda.bpm.engine.impl.cmd.AbstractCorrelateMessageCmd.instantiateProcess(AbstractCorrelateMessageCmd.java:68)
        at org.camunda.bpm.engine.impl.cmd.AbstractCorrelateMessageCmd.createMessageCorrelationResult(AbstractCorrelateMessageCmd.java:94)
        at org.camunda.bpm.engine.impl.cmd.CorrelateMessageCmd.execute(CorrelateMessageCmd.java:69)

I hope it should be like ${eventService}