{"record":{"id":"d488ba36a53a9a7f","repo":"spring-projects/spring-framework","slug":"no-stringvalueresolver-specified-pass-a-resolver","errorCode":null,"errorMessage":"No StringValueResolver specified - pass a resolver object into the constructor or override the 'resolveStringValue' method","messagePattern":"No StringValueResolver specified - pass a resolver object into the constructor or override the 'resolveStringValue' method","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionVisitor.java","lineNumber":288,"sourceCode":"\t\t\tObject val = entry.getValue();\n\t\t\tObject newVal = resolveValue(val);\n\t\t\tnewContent.put(newKey, newVal);\n\t\t\tentriesModified = entriesModified || (newVal != val || newKey != key || newKeyHash != keyHash);\n\t\t}\n\t\tif (entriesModified) {\n\t\t\tmapVal.clear();\n\t\t\tmapVal.putAll(newContent);\n\t\t}\n\t}\n\n\t/**\n\t * Resolve the given String value, for example parsing placeholders.\n\t * @param strVal the original String value\n\t * @return the resolved String value\n\t */\n\tprotected @Nullable String resolveStringValue(String strVal) {\n\t\tif (this.valueResolver == null) {\n\t\t\tthrow new IllegalStateException(\"No StringValueResolver specified - pass a resolver \" +\n\t\t\t\t\t\"object into the constructor or override the 'resolveStringValue' method\");\n\t\t}\n\t\tString resolvedValue = this.valueResolver.resolveStringValue(strVal);\n\t\t// Return original String if not modified.\n\t\treturn (strVal.equals(resolvedValue) ? strVal : resolvedValue);\n\t}\n\n}\n","sourceCodeStart":270,"sourceCodeEnd":297,"githubUrl":"https://github.com/spring-projects/spring-framework/blob/69bf83ad716d0cfc4b0520a19b4d8b24c79d1538/spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionVisitor.java#L270-L297","documentation":"Thrown as an IllegalStateException when BeanDefinitionVisitor.resolveStringValue is called but no StringValueResolver has been provided. The visitor (used to resolve placeholders in bean definition property/constructor values) requires a resolver; if it was constructed without one and the subclass did not override resolveStringValue, attempting to resolve any string value fails.","triggerScenarios":"Constructing a BeanDefinitionVisitor() with the no-arg constructor (resolver stays null) and then calling visitBeanDefinition / resolveStringValue on a bean definition that contains placeholder strings. The default resolveStringValue accesses this.valueResolver, which is null, so it throws.","commonSituations":"Using BeanDefinitionVisitor to walk a bean definition manually without passing an EmbeddedValueResolver or ConfigurableBeanFactory; PropertySourcesPlaceholderConfigurer not registered so no resolver is in scope when the visitor runs; subclass of BeanDefinitionVisitor that forgot to override resolveStringValue; programmatic bean definition processing that expects placeholders but supplies no resolver.","solutions":["Pass a resolver to the visitor: new BeanDefinitionResolver(embeddedValueResolver) or new BeanDefinitionVisitor(beanFactory) where beanFactory is a ConfigurableBeanFactory.","If subclassing, override resolveStringValue(String) to implement your own resolution so the null-resolver path is never hit.","Register a PropertySourcesPlaceholderConfigurer / PropertyResolver in the context so an EmbeddedValueResolver is available.","Avoid visiting bean definitions that contain unresolved placeholders, or strip them before visiting."],"exampleFix":"// before: no resolver -> IllegalStateException on first placeholder\nBeanDefinitionVisitor visitor = new BeanDefinitionVisitor();\nvisitor.visitBeanDefinition(beanDefinition);\n\n// after: pass a resolver derived from the bean factory\nStringValueResolver resolver = new EmbeddedValueResolver(beanFactory);\nBeanDefinitionVisitor visitor = new BeanDefinitionVisitor(resolver);\nvisitor.visitBeanDefinition(beanDefinition);","handlingStrategy":"validation","validationCode":"StringValueResolver resolver = new EmbeddedValueResolver(beanFactory);\nBeanDefinitionVisitor visitor = new BeanDefinitionVisitor(resolver);\nAssert.notNull(resolver, \"StringValueResolver must be set before visiting\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass a resolver (EmbeddedValueResolver or ConfigurableBeanFactory) to BeanDefinitionVisitor.","Subclass and override resolveStringValue if you implement custom resolution.","Register a PropertySourcesPlaceholderConfigurer so resolvers are available.","Avoid walking bean definitions with unresolved placeholders."],"tags":["spring","bean-definition","placeholder","configuration"],"backgroundTag":null,"analyzedSha":"69bf83ad716d0cfc4b0520a19b4d8b24c79d1538","analyzedAt":"2026-08-09T15:32:58.770Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}