【问题标题】: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 之间的库版本冲突有关,但是我应该保留哪个以及如何保留。

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

提前非常感谢!

【问题讨论】:

    标签: java spring-boot azure azure-storage


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2015-08-02
        • 2020-09-22
        • 2020-11-24
        • 2018-04-26
        • 2013-08-28
        • 2017-12-17
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        相关资源
        最近更新 更多