Azure + SpringBoot 'com/fasterxml/jackson/core/JsonFactory'

Posted

技术标签:

【中文标题】Azure + SpringBoot \'com/fasterxml/jackson/core/JsonFactory\'【英文标题】:Azure + SpringBoot 'com/fasterxml/jackson/core/JsonFactory'Azure + SpringBoot 'com/fasterxml/jackson/core/JsonFactory' 【发布时间】:2021-10-08 06:33:01 【问题描述】:

我开始使用 Java + SprintBoot + AzureStorage。我刚刚使用以下配置通过 Spring 初始化程序创建了一个项目:

我正在尝试创建一个简单的 rest 方法来从 Azure 返回共享列表,但出现以下错误:

Exception Details:
  Location:
    com/fasterxml/jackson/databind/cfg/MapperBuilder.streamFactory()Lcom/fasterxml/jackson/core/TokenStreamFactory; @7: areturn
  Reason:
    Type 'com/fasterxml/jackson/core/JsonFactory' (current frame, stack[0]) is not assignable to 'com/fasterxml/jackson/core/TokenStreamFactory' (from method signature)
  Current Frame:
    bci: @7
    flags:  
    locals:  'com/fasterxml/jackson/databind/cfg/MapperBuilder' 
    stack:  'com/fasterxml/jackson/core/JsonFactory' 

据我所知,我的代码中没有什么特别的地方可以分享:

AzureStoreService

@Service
public class AzureStorageService 

    @Value("$azure.storage.accountName")
    private String accountName;

    @Value("$azure.storage.accountKey")
    private String token;

    private ShareServiceClient createServiceClient() 
        String shareURL = String.format("https://%s.file.core.windows.net", accountName);
        return new ShareServiceClientBuilder().endpoint(shareURL).sasToken(token).buildClient();
    

    public List<String> listShares() 
        List<String> shares = new ArrayList<>(0);
        ShareServiceClient client = createServiceClient();
        client.listShares().forEach(item -> shares.add(item.getName()));
        return shares;
    

AzureController

@RestController
@RequestMapping("/storage")
public class AzureController 

    @Autowired
    private AzureStorageService azureStorageService;

    @GetMapping("/list-shares")
    private ResponseEntity<List<String>> listShares() 
        List<String> shares = azureStorageService.listShares();
        return new ResponseEntity<>(shares, HttpStatus.OK);
    

我猜这个问题与 Spring Boot 和 Azure 之间的库版本冲突有关,但是我应该保留哪个以及如何保留。

您之前可能遇到过这个问题,欢迎任何提示/建议。

提前非常感谢!

【问题讨论】:

【参考方案1】:

如果你使用的是springboot,那么默认会添加jackson,

所以你手动添加的jackson版本可能与spring boot添加的版本冲突,

尝试从 pom.xml 中删除 jackson 依赖项。

如果你需要覆盖spring boot默认添加的版本,那么你需要先排除它,然后添加你自己的依赖。

<dependency> 
        <groupId>com.fasterxml.jackson.core</groupId> 
        <artifactId>jackson-core</artifactId> 
        <version>2.12.1</version> 
 </dependency> 

【讨论】:

【参考方案2】:

我终于找到了这个问题的根本原因:

我忘记提到的一件重要的事情是我正在使用 JBoss 来部署应用程序,而问题出在这,因为 JBoss 包含的模块。所以我只需要添加一个部署结构文件。

jboss-deployment-estructure.xml

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <module-alias name="deployment.AzureTestWS"/>
        <exclusions>
            <module name="com.fasterxml.jackson.core.jackson-core"/>
            <module name="com.fasterxml.jackson.core.jackson-databind"/>
            <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310"/>
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

这适用于 JBoss EAP 7.2 上的 mi

【讨论】:

以上是关于Azure + SpringBoot 'com/fasterxml/jackson/core/JsonFactory'的主要内容,如果未能解决你的问题,请参考以下文章

JWT 令牌的签名无效 - Azure + Spring Boot

Spring Boot - 无法连接 Azure MySQL 数据库

未在 Azure 中创建 Spring Boot 会话

在 Azure 应用服务中具有信任库的 Spring Boot 容器

无法在 Azure 中部署 Spring Boot 应用程序

从 Azure 密钥保管库存储和检索 JKS