Assist in Spring application development - Adds support for start initializr, autocomplete Spring Boot/Cloud configuration key/value, Spring reference configuration, Spring metadata documentation.(Support: Java, Kotlin, application.yml and bootstrap.properties)
Features:
Spring Initializr
- Allows you to bootstrap new project or new module using
File / New / Project / Spring Initializr
orFile / New / Module / Spring Initializr
wizards.
Autocomplete configuration properties
- Autocompletion of the configuration properties in your
yaml
/properties
files based on the spring boot's autoconfiguration jars are present in the classpath - Auto-completion of the configuration properties in your
yaml
/properties
files if you have classes annotated with@ConfigurationProperties
, if your build is properly configured - Short form search & search for element deep within is also supported. i.e,
sp.d
will show youspring.data
,spring.datasource
, also,port
would showserver.port
as a suggestion - Quick documentation for groups & properties (not all groups & properties will have documentation, depends on whether the original author specified documentation or not for any given element)
![Autocomplete in action](https://github.com/eltonsandre/intellij-spring-boot-assistant/blob/main/gif/completion-hints.gif?raw=true)
Go to configuration properties
- Ctrl+click to go to property or code
![Goto in action](https://github.com/eltonsandre/intellij-spring-boot-assistant/blob/main/gif/goto-key-value.gif?raw=true)
- goto placeholder
![Goto in action](https://github.com/eltonsandre/intellij-spring-boot-assistant/blob/main/gif/placeholder.gif?raw=true)
Action to Spring Configuration Files:
- Clone as YAML 🔀 Properties File
- Converter as YAML 🔀 Properties File
Action in editor configuration yml / properties:
- Copy key to Clipboard
- Copy key as environment variable to Clipboard
Copy request mappings as cURL @RestController/@Controller (beta)
Usage
Assuming that you have Spring boot's autoconfiguration jars are present in the classpath, this plugin will automatically allows you to autocomplete
properties as suggestions in all your yml
files
Suggestions would appear as soon as you type/press Ctrl+Space
.
Short form suggestions are also supported such as, sp.d
will show you spring.data
, spring.datasource
, e.t.c as suggestions that make your typing
faster
In addition to libraries in the classpath, the plugin also allows you to have your own @ConfigurationProperties
available as suggestions in all
your yml
files.
For this to work, you need to ensure the following steps are followed for your project/module
Qiang Su
26.09.2024com.intellij.diagnostic.PluginException: Short name 'return' is not unique class 'dev.eltonsandre.A.new.D.OoOO.return' in PluginDescriptor(name=Spring Boot Helper, id=dev.eltonsandre.intellij.spring.assistant.plugin, descriptorPath=plugin.xml, path=~/Library/Application Support/JetBrains/IntelliJIdea2024.2/plugins/spring-boot-helper, version=2023.1.2, package=null, isBundled=false) and class 'dev.eltonsandre.A.new.D.C.return' in PluginDescriptor(name=Spring Boot Helper, id=dev.eltonsandre.intellij.spring.assistant.plugin, descriptorPath=plugin.xml, path=~/Library/Application Support/JetBrains/IntelliJIdea2024.2/plugins/spring-boot-helper, version=2023.1.2, package=null, isBundled=false) conflict at com.intellij.codeInspection.ex.InspectionToolRegistrarKt.checkForDuplicateShortName(InspectionToolRegistrar.kt:167) at com.intellij.codeInspection.ex.InspectionToolRegistrarKt.registerInspection(InspectionToolRegistrar.kt:126) at com.intellij.codeInspection.ex.InspectionToolRegistrarKt.access$registerInspection(InspectionToolRegistrar.kt:1) at com.intellij.codeInspection.ex.InspectionToolRegistrar.registerInspections(InspectionToolRegistrar.kt:58) at com.intellij.codeInspection.ex.InspectionToolRegistrar.(InspectionToolRegistrar.kt:40) at com.intellij.platform.instanceContainer.instantiation.InstantiateKt$instantiate$2.invoke(instantiate.kt:45) at com.intellij.platform.instanceContainer.instantiation.InstantiateKt$instantiate$2.invoke(instantiate.kt:42) at com.intellij.platform.instanceContainer.instantiation.InstantiateKt.instantiate(instantiate.kt:313) at com.intellij.platform.instanceContainer.instantiation.InstantiateKt.instantiate(instantiate.kt:42) at com.intellij.serviceContainer.LightServiceInstanceSupport$LightServiceInstanceInitializer.createInstance(LightServiceInstanceSupport.kt:47) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1$1.invokeSuspend(LazyInstanceHolder.kt:162) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1$1.invoke(LazyInstanceHolder.kt) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1$1.invoke(LazyInstanceHolder.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:62) at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:163) at kotlinx.coroutines.BuildersKt.withContext(Unknown Source) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1.invokeSuspend(LazyInstanceHolder.kt:160) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1.invoke(LazyInstanceHolder.kt) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1.invoke(LazyInstanceHolder.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:27) at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:90) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:123) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:52) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.initialize(LazyInstanceHolder.kt:145) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.access$initialize(LazyInstanceHolder.kt:13) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.tryInitialize(LazyInstanceHolder.kt:135) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.getInstance(LazyInstanceHolder.kt:95) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.getInstanceInCallerContext$suspendImpl(LazyInstanceHolder.kt:87) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.getInstanceInCallerContext(LazyInstanceHolder.kt) at com.intellij.serviceContainer.ComponentManagerImplKt$doGetOrCreateInstanceBlocking$1.invokeSuspend(ComponentManagerImpl.kt:1568) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:111) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$BuildersKt__BuildersKt(Builders.kt:84) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:52) at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source) at com.intellij.serviceContainer.ComponentManagerImplKt$runBlockingInitialization$1.invoke(ComponentManagerImpl.kt:1686) at com.intellij.serviceContainer.ComponentManagerImplKt$runBlockingInitialization$1.invoke(ComponentManagerImpl.kt:1677) at com.intellij.openapi.progress.ContextKt.prepareThreadContext(context.kt:82) at com.intellij.serviceContainer.ComponentManagerImplKt.runBlockingInitialization(ComponentManagerImpl.kt:1677) at com.intellij.serviceContainer.ComponentManagerImplKt.doGetOrCreateInstanceBlocking(ComponentManagerImpl.kt:1567) at com.intellij.serviceContainer.ComponentManagerImplKt.getOrCreateInstanceBlocking(ComponentManagerImpl.kt:1562) at com.intellij.serviceContainer.ComponentManagerImpl.doGetService(ComponentManagerImpl.kt:746) at com.intellij.serviceContainer.ComponentManagerImpl.getService(ComponentManagerImpl.kt:690) at com.intellij.codeInspection.ex.InspectionToolRegistrar$Companion.getInstance(InspectionToolRegistrar.kt:198) at com.intellij.codeInspection.ex.InspectionToolRegistrar.getInstance(InspectionToolRegistrar.kt) at com.intellij.codeInspection.ex.InspectionProfileImpl.(InspectionProfileImpl.java:84) at com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettingsImpl.loadState(DaemonCodeAnalyzerSettingsImpl.kt:46) at com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettingsImpl.loadState(DaemonCodeAnalyzerSettingsImpl.kt:17) at com.intellij.configurationStore.ComponentStoreImpl.doInitComponent(ComponentStoreImpl.kt:593) at com.intellij.configurationStore.ComponentStoreImpl.initComponent(ComponentStoreImpl.kt:493) at com.intellij.configurationStore.ComponentStoreImpl.initComponent(ComponentStoreImpl.kt:160) at com.intellij.configurationStore.ComponentStoreWithExtraComponents.initComponent(ComponentStoreWithExtraComponents.kt:46) at com.intellij.serviceContainer.ComponentManagerImpl.initializeService$intellij_platform_serviceContainer(ComponentManagerImpl.kt:651) at com.intellij.serviceContainer.ServiceInstanceInitializer.createInstance$suspendImpl(ServiceInstanceInitializer.kt:70) at com.intellij.serviceContainer.ServiceInstanceInitializer.createInstance(ServiceInstanceInitializer.kt) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1$1.invokeSuspend(LazyInstanceHolder.kt:162) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1$1.invoke(LazyInstanceHolder.kt) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1$1.invoke(LazyInstanceHolder.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:62) at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:163) at kotlinx.coroutines.BuildersKt.withContext(Unknown Source) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1.invokeSuspend(LazyInstanceHolder.kt:160) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1.invoke(LazyInstanceHolder.kt) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder$initialize$1.invoke(LazyInstanceHolder.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:27) at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:90) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:123) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:52) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.initialize(LazyInstanceHolder.kt:145) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.access$initialize(LazyInstanceHolder.kt:13) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.tryInitialize(LazyInstanceHolder.kt:135) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.getInstance(LazyInstanceHolder.kt:95) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.getInstance$suspendImpl(LazyInstanceHolder.kt:83) at com.intellij.platform.instanceContainer.internal.LazyInstanceHolder.getInstance(LazyInstanceHolder.kt) at com.intellij.platform.instanceContainer.internal.InstanceContainerImpl.instance(InstanceContainerImpl.kt:68) at com.intellij.serviceContainer.ComponentManagerImpl.getServiceAsync(ComponentManagerImpl.kt:694) at com.intellij.openapi.project.impl.ProjectFrameAllocatorKt$restoreEditors$2$daemonCodeAnalyzerSettingsJob$1.invokeSuspend(ProjectFrameAllocator.kt:582) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:608) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:873) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:763) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:750)