全部产品
云市场

常见问题

更新时间:2020-03-19 10:34:59

说明:有关 SOFABoot 各版本的已知问题列表,请查看 限制与已知问题

升级相关问题


其他常见问题


升级相关问题

升级前有哪些环节准备

在升级前,必须安装 JDK 7 和 Maven 3.2.5。具体安装步骤,可参考文档 配置 SOFABoot 环境


如何激活不同环境配置

当您需要在不同环境下(如开发环境、测试环境、预发布环境、生产环境)提供不同的配置时,可以在启动 SOFABoot 应用时加上以下 JVM 启动参数:

  1. -Dspring.profiles.active=${workspace_name}

更多信息,见 工程配置解决方案


完成编译后,如何在本地运行

在工程根目录下执行下列命令:

  1. mvn clean install
  2. java -jar ./target/${file.name}-executable.jar (使用 java -jar 命令运行一个 Fat Jar,在 SOFAStack 上部署应用也是这种方式)

当然本地开发时,可以直接使用 main 函数启动整个应用。

更多信息,参见 本地编译运行


如何使用占位符

可以通过配置文件统一管控所有的普通 bean 的配置。

以 SOFARPC 中间件为例,支持对 test-url 进行占位符配置,如下所示:

  1. <sofa:reference id="sampleRpcService"
  2. interface="com.alipay.sofaboot.serverone.facade.rpc.SampleRpcService">
  3. <sofa:binding.tr>
  4. <sofa:global-attrs test-url="${test.url}"/>
  5. </sofa:binding.tr>
  6. </sofa:reference>

日志中出现 StackOverFlow 错误

现象

您可能在日志中看到以下堆栈错误:

  1. Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError:
  2. Exception in thread java.lang.StackOverflowError
  3. at java.util.Hashtable.containsKey(Hashtable.java:306)
  4. at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:36)
  5. at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
  6. at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
  7. at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)
  8. at org.apache.log4j.Category.<init>(Category.java:53)
  9. at org.apache.log4j.Logger..<init>(Logger.java:35)
  10. at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:39)
  11. at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
  12. at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
  13. at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)
  14. at org.apache.log4j.Category..<init>(Category.java:53)
  15. at org.apache.log4j.Logger..<init>(Logger.java:35)
  16. at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:39)
  17. at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
  18. subsequent lines omitted...

原因

这是由于 org.slf4j:log4j-over-slf4jlog4j:log4j 存在冲突而导致的。

解决方案

在 ClassPath 中删除 log4j-over-slf4j 依赖即可解决该问题。


如何引入 Spring Boot 的 Web 容器

  • 引入 spring-boot-starter-web,默认依赖并启动的 Web 容器是 Tomcat,依赖信息类似如下:

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-web</artifactId>
    4. </dependency>
  • 如果要引入 Jetty 作为 Web 容器,可以参考 Spring Boot 官方文档 进行配置。


在 SOFABoot 工程中如何处理自定义 filter

SOFABoot 工程中没有 Spring 工程的 web.xml,如果原 Spring MVC 的 web.xml 配置文件有自定义配置 filter,可以参考 SpringBoot 官方迁移 Servlets、Filters、listeners 的方法,也可以参考 中文配置案例


日志中出现 ConverterRegistry.addConverter 报错

现象

在日志中出现如下记录:

  1. Caused by:java.lang.NoSuchMethodError:org.springframework.core.convert.converter.ConverterRegistry.addConverter(Ljava/lang/Class;Ljava/lang/Class;Lorg/springframework/core/convert/converter/Converter;)

原因

这是由于 Spring 版本冲突所导致。

解决方案

目前的 Spring 统一版本为 4.3.4.RELEASE,删除间接引入的其他版本即可解决该问题。


日志中出现 LoggerSpaceManager.getLoggerBySpace 报错

现象

在日志中出现如下记录:

  1. Caused by:java.lang.NoSuchMethodError: com.alipay.sofa.common.log.LoggerSpaceManager.getLoggerBySpace(Ljava/lang/String;Lcom/alipay/sofa/common/log/SpaceId;Ljava/util/Map;)Lorg/slf4j/Logger;

原因

从 2.2.X 版本后,由于 ArtifactId sofa-middleware-log 升级为 sofa-common-tools,所以当使用 SOFABoot 2.2.X 的版本时,保证 classpath 依赖的是 sofa-common-tools(版本已经管控不需要用户显示添加版本) 同时排除掉 sofa-middleware-log 依赖即可以解决冲突问题。

解决方案

删除以下间接依赖:

  1. <dependency>
  2. <groupId>com.alipay.sofa.common.log</groupId>
  3. <artifactId>sofa-middleware-log</artifactId>
  4. </dependency>

并引入以下依赖:

  1. <dependency>
  2. <groupId>com.alipay.sofa.common</groupId>
  3. <artifactId>sofa-common-tools</artifactId>
  4. </dependency>

如何访问默认关闭的敏感端点(Sensitive Endpoints)

SOFABoot 2.5.0 及以上版本解决了因 Endpoints 信息暴露过多而导致的安全问题,默认关闭一些具备安全风险的 Endpoints。如果您需要开启相应的 Endpoints,请参考 Spring Boot 使用文档

SOFABoot 是否支持分布式 Session

SOFABoot 不支持分布式 Session。

采用 SOFABoot 框架后,建议由用户在 Spring Boot 基础上自主进行 Session 的管理和维护。存储方案可继续使用 OCS。


其他常见问题

如何显示自动配置的详细信息

加上 JVM 运行参数 -Ddebug,可以显示启动过程中的详细信息,并通过 Debug 级别的日志显示已启动的自动配置的 bean 服务。


如何使用 dependencyManagement 添加 SOFABoot 依赖

  • 工程原型中是用 parent 标签引入 SOFABoot 的间接依赖。

  • 也可以使用 dependencyManagement 添加依赖,如下所示:

    1. <dependencyManagement>
    2. <dependencies>
    3. <!-- SOFABoot dependencies -->
    4. <dependency>
    5. <groupId>com.alipay.sofa</groupId>
    6. <artifactId>sofaboot-enterprise-dependencies</artifactId>
    7. <version>2.3.1</version>
    8. <type>pom</type>
    9. <scope>import</scope>
    10. </dependency>

使用 DEV 模式进行 RPC 调用时提示找不到服务

检查电脑用户主目录下是否存在名为 localFileRegisty 的目录以及 localFileRegisty 目录下是否存在名为 localRegistry.reg 的文件。

  • 如果存在,则检查其中是否存在需要调用的服务的元数据信息。同时,请保证 DEV 模式下发布服务的应用使用的是 SOFABoot 2.1.3 及以上的版本.
  • 如果不存在,将服务发布端应用的 SOFABoot 升级到 2.1.3 及以上版本。

SOFABoot 是否支持 iBATIS

  • iBATIS 可以在 SOFABoot 中使用。但 SOFABoot 使用的是 Spring 4,而 Spring 4 不支持 iBATIS,在使用过程中可能会遇到类似“SqlMapClientDAOSupport 类找不到”的问题。

    因此,您可以在对应的 pom.xml 中添加如下 iBATIS 提供的依赖:

    1. <dependency>
    2. <groupId>org.mybatis</groupId>
    3. <artifactId>mybatis-2-spring</artifactId>
    4. <version>1.0.3</version>
    5. </dependency>
  • iBATIS 社区已经不支持运维,为了以后长期的发展与业务稳定,建议升级到 MyBatis。配置方法可遵照 MyBatis 官网文档 - 如何接入 Spring Boot

Unsupported major.minor version 51.0 异常

现象

当编译工程时,收到以下报错:

  1. Exception in thread "main" java.lang.UnsupportedClassVersionError :
  2. Unsupported major.minor version 51.0

解决方案

使用 JDK 7 或以上版本来运行工程(推荐使用 JDK 8)。


Tracer 类转换异常

现象

出现如下错误:

原因

DummyContextUtil 的 create 操作和 clear 操作必须要配合使用。如果调用 create 操作时,当前 Tracer 上下文(即 ThreadLocal 中)不为空,便会出现 Tracer 类转换异常的错误。

解决方案

在调用 create 操作时,与 clear 操作配合使用即可。


Spring 配置解析错误

现象

Spring 在解析配置文件时出现如下错误:

  1. Caused by: org.xml.sax.SAXParseException; lineNumber: 240; columnNumber: 58; 对实体 "v" 的引用必须以 ';' 分隔符结尾。
  2. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
  3. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
  4. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
  5. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
  6. at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
  7. at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:913)
  8. at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:447)
  9. at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:250)
  10. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)
  11. at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
  12. at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
  13. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
  14. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
  15. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
  16. at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
  17. at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
  18. at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
  19. at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:76)
  20. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:429)
  21. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
  22. ... 56 more

原因

配置文件中出现 & 字符,如 p=1&v=4.0

解决方案

将配置的字符 & 换为转义字符 &amp; 进行配置即可。如:将 p=1&v=4.0 替换为 p=1&amp;v=4.0


Maven 打包时出现规则检查错误

现象

Maven 打包时出现如下提示:

  1. Please check rules in your project:
  2. 1. SOFATracer dependencies should be com.alipay.sofa:tracer-core and com.alipay.sofa:tracer-extensions !!!
  3. 2. SOFALookout dependency should be com.alipay.sofa.lookout:lookout-api !!!

原因

SOFABoot 2.4.0 及以上版本更新了 SOFATracer 及 SOFALookout 的依赖,并强制执行规则检查。未更新的依赖会导致 Maven 编译失败。

解决方案

更新 SOFATracer 及 SOFALookout 依赖如下:

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>tracer-core</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.alipay.sofa</groupId>
  7. <artifactId>tracer-extensions</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>com.alipay.sofa.lookout</groupId>
  11. <artifactId>lookout-api</artifactId>
  12. </dependency>

SOFABoot 应用莫名其妙退出

现象

如题

原因

  • 没有使用发布部署运行应用,而是直接使用 java 运行。
  • 在运行应用时,未使用 nohup,导致当前窗口关闭后,SOFABoot 应用关闭。

示例如下:莫名退出1莫名退出2

解决方案

使用类似下述命令行,启动应用:
nohup java -Djava.security.egd=file:/dev/./urandom -jar XXX.jar > Log.log &


SOFABoot 应用在云端启动缓慢

现象

如题

原因

使用默认的 /dev/random 取随机数的时候依赖于系统中断,因此在系统的中断数不足时,/dev/random 设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用。

解决方案

启动的时候传入参数 -Djava.security.egd=file:/dev/./urandom

说明/dev/urandom 不依赖系统的中断,也就不会造成进程忙等待,但是会导致数据的随机性不高。


SOFABoot 应用在云端无法启动 tengine

现象

如题

原因

应用程序有 hook,修改了 WORK_DIR 这个变量。示例如下:无法启动 tengine

解决方案

修改应用程序代码,使其不要修改 WORK_DIR,因为技术栈使用了该变量。


profiles-active 启动参数出现问题导致服务无法启动

现象

profiles-active 启动参数出现问题导致服务无法启动。

  • 客户在发布部署页面配置了 2 个环境参数:-Ddbmode=coredev-Dspring.profiles.active = dev
  • 在实际部署时多出 1 个参数 -Dspring.profiles.active=coredev
  • 服务无法启动

原因

客户的配置文件名称有误。

解决方案

修改 application-dev.propertiesapplication-coredev.properties