Sping Boot 3应用程序可在嵌入式Tomcat上运行,但不能在外部运行

kr98yfug  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在将我们的应用程序从Sping Boot 2.7.10升级到3.0.5
我在IDE上运行它,在嵌入式Tomcat和外部Tomcat(Sping Boot 2.7.x版本9)上运行它。
仍然在嵌入式Tomcat上运行,但不在外部Tomcat 10上运行。我得到:

Failed to bind properties under 'my-configuration.object-mapper.serializer-provider.generator.write-capabilities' to com.fasterxml.jackson.core.util.JacksonFeatureSet<com.fasterxml.jackson.core.StreamWriteCapability>:

    Reason: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'my-configuration.object-mapper.serializer-provider.generator.write-capabilities' to com.fasterxml.jackson.core.util.JacksonFeatureSet<com.fasterxml.jackson.core.StreamWriteCapability>

使用

@ConfigurationProperties(prefix = "my-configuration")
@Getter
@Setter
public class MyConfiguration {
    private ObjectMapper objectMapper;
}

我可以通过指定ignoreInvalidFields来抑制错误,但要确保它是否是正确的解决方案。

@ConfigurationProperties(prefix = "my-configuration", ignoreInvalidFields = true)

毫无疑问,我必须重构我们的配置类,但我仍然想了解发生了什么,为什么Sping Boot 3和外部Tomcat失败了。
Stacktrace

Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'my-configuration.object-mapper.serializer-provider.generator.write-capabilities' to com.fasterxml.jackson.core.util.JacksonFeatureSet<com.fasterxml.jackson.core.StreamWriteCapability>
        at org.springframework.boot.context.properties.bind.Binder.handleBindError(Binder.java:387)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:347)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$4(Binder.java:472)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:86)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:62)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:476)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:590)
        at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:576)
        at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:474)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:414)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:343)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$4(Binder.java:472)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:86)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:62)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:476)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:590)
        at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:576)
        at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:474)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:414)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:343)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$4(Binder.java:472)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:86)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:62)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:476)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:590)
        at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:576)
        at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:474)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:414)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:343)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$4(Binder.java:472)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:86)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:62)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:476)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:590)
        at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:576)
        at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:474)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:414)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:343)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$4(Binder.java:472)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:86)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:62)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:476)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:590)
        at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:576)
        at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:474)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:414)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:343)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:332)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:262)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:249)
        at org.springframework.boot.context.properties.ConfigurationPropertiesBinder.bind(ConfigurationPropertiesBinder.java:93)
        at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.bind(ConfigurationPropertiesBindingPostProcessor.java:96)
        ... 121 more
    Caused by: java.lang.IllegalStateException: Unable to get value for property write-capabilities
        at org.springframework.boot.context.properties.bind.JavaBeanBinder$BeanProperty.lambda$getValue$0(JavaBeanBinder.java:360)
        at org.springframework.boot.context.properties.bind.DefaultBindConstructorProvider.getBindConstructor(DefaultBindConstructorProvider.java:46)
        at org.springframework.boot.context.properties.bind.ValueObjectBinder$ValueObject.get(ValueObjectBinder.java:190)
        at org.springframework.boot.context.properties.bind.ValueObjectBinder.bind(ValueObjectBinder.java:67)
        at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:476)
        at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:590)
        at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:576)
        at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:474)
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:414)
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:343)
        ... 176 more
    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fasterxml.jackson.core.JsonGenerator]: Is it an abstract class?
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:215)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:153)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder$Bean.lambda$getSupplier$0(JavaBeanBinder.java:217)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder$BeanSupplier.get(JavaBeanBinder.java:279)
        at org.springframework.boot.context.properties.bind.JavaBeanBinder$BeanProperty.lambda$getValue$0(JavaBeanBinder.java:357)
        ... 185 more
    Caused by: java.lang.InstantiationException
        at java.base/jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:198)
        ... 189 more
fcg9iug3

fcg9iug31#

正如在www.example.com问题中所解释https://github.com/spring-projects/spring-boot/issues/35091#issuecomment-1516051146,主要原因是外部Tomcat启用了JNDI
它影响属性绑定。JNDI不允许枚举它包含的所有属性,因此,Spring不是找到所有属性并将其绑定到目标,而是询问所有目标它们有什么属性,然后尝试绑定它们。这就是ObjectMapper导致问题的原因。

相关问题