在Springboot中集成unihttp后应用无法启动的解决办法
目录
前言
一、最开始的应用集成
1、使用unihttp定义第三方访问接口
2、在SpringBoot应用中集成unihttp
3、启动时发生的问题
二、问题解决
1、一种解决办法
2、未来的优化
三、总结
前言
在当今的软件开发领域,SpringBoot框架以其简洁、高效、灵活的特点,成为了众多开发者构建Java应用程序的首选。它能够帮助开发者快速搭建项目,简化繁琐的配置过程,让开发变得更加高效和便捷。而UniHttp作为一个声明式的HTTP接口对接框架,也以其独特的魅力吸引了众多开发者的目光。它能够极大地简化HTTP请求的发送过程,让开发者像调用本地方法一样发起HTTP请求,无需关注请求的发送细节、参数传递、结果处理和反序列化等问题,从而更加专注于业务逻辑的实现。
然而,在将UniHttp集成到SpringBoot项目的过程中,开发者们往往会遇到各种各样的问题。这些问题可能涉及到依赖冲突、配置不当、请求参数处理、响应结果解析等多个方面。例如,在引入UniHttp依赖中,在配置自定义的Http客户端时,如果不熟悉Spring的配置机制,可能会出现配置错误,影响HTTP请求的发送和接收。此外,在处理请求参数和响应结果时,也可能因为对UniHttp的注解和方法使用不当,而导致数据解析错误或请求失败。如下图所示,在SpringBoot中配置了UniHttp之后,导致整个应用程序都无法启动了。
为了帮助开发者们更好地理解和解决这些问题,本文将对在SpringBoot中集成UniHttp时遇到的无法启动的问题进行详细记录和分析。通过对这些问题的深入探讨,希望能够为其他开发者提供一些有价值的参考和借鉴,帮助他们在项目开发过程中更加顺利地使用UniHttp,充分发挥其优势,提高开发效率和项目质量。如果您在集成过程中也遇到这个问题,不妨来这里看看。
一、最开始的应用集成
为了让第一次查阅本文的朋友对如何把Unihttp集成到SpringBoot中,这里有必要对springBoot中的集成进行简单的讲解。首先介绍如何创建第三方访问接口,其次介绍如何在SpringBoot中集成unihttp,最后介绍在应用程序启动后出现的问题。
1、使用unihttp定义第三方访问接口
根据unihttp的官方文档,要想在springboot中定义第三方访问接口。我们创建一个第三方访问接口,然后在接口中声明具体访问的接口,(这里以访问天地图的地址编码和驾车路线规划两个接口)具体的实例代码如下:
package com.yelang.project.thridinterface;
import com.burukeyou.uniapi.http.annotation.HttpApi;
import com.burukeyou.uniapi.http.annotation.param.QueryPar;
import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
@HttpApi(url = "http://api.tianditu.gov.cn/")
public interface TdtOptionService {
@GetHttpInterface("geocoder")
public HttpResponse<String> getGeocoder(@QueryPar("ds") String ds,@QueryPar("tk") String tk);
@GetHttpInterface("drive")
public HttpResponse<String> drivePlan(@QueryPar("postStr") String postStr,@QueryPar("type") String type,@QueryPar("tk") String tk);
}
2、在SpringBoot应用中集成unihttp
之前是在使用junit中进行集成,只需要在Junit的方法定义中引入@UniAPIScan进行扫描,在实际工程应用中,我们只需要将扫描注解定义配置到Application这个入口类中即可,代码如下所示:
package com.yelang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component;
import com.burukeyou.uniapi.annotation.UniAPIScan;
import com.yelang.common.utils.IpUtils;
/**
* 启动程序
*
* @author 夜郎king
*/
@UniAPIScan("com.yelang.project.thridinterface") // 指定@HttpApi接口所在的包路径
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,FlywayAutoConfiguration.class })
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
}
}
3、启动时发生的问题
万事俱备,只欠东风,经过上述的定义之后,我们来尝试启动应用服务。不出意外还是出现了意外。本来是好的应用程序出现了以下的错误。
***************************
APPLICATION FAILED TO START
***************************
Description:
Field tdtOptionService in com.yelang.project.education.service.impl.TdtRoutingServiceImpl required a bean of type 'com.yelang.project.thridinterface.TdtOptionService' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.yelang.project.thridinterface.TdtOptionService' in your configuration.
根据报错的信息来看, TdtOptionService这个类没有注入成功。那是什么原因导致了类启动失败呢?在下面小节中来详细讲解。
二、问题解决
本节将采用解决办法来解决应用程序无法启动的问题。也一并分析了这种方案的优缺点,最后简要介绍官方的一些信息,期待在未来的版本中进行优化。
1、一种解决办法
之所以我们的应用程序遇到了无法启动的情况,主要是在程序开发中我们使用了程序热加载的逻辑,如果当前应用程序没有使用这种模式。如果您的开发环境没有引入热加载,那么可以忽略本篇内容。通常在springboot中引入热加载的方法如下,首先在pom.xml中申明以下引用:
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
第一种方法是将以上的声明注释掉,注释后再一次运行程序,你会发现服务可以正常启动。
如果不想将Pom.xml中的相关配置注释掉,还有一种方法就是在应用程序中禁用热加载,禁用设置代码如下:
public static void main(String[] args) {
//禁用热加载,否则unihttp集成会失败
System.setProperty("spring.devtools.restart.enabled", "false");
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
}
当然这种方法跟xml直接注释的方法效果是一样的。也可以成功启动服务。
以上两种方法大家可以选用,都可以解决服务不能启动的问题。
2、未来的优化
关于springboot的热加载,在生产上不推荐大家使用。开发和测试时可以按需使用。因此如果线上不需要的话,直接关闭这个功能就可以实现无缝集成。后来我在翻阅unihttp的官方issue时发现,好像有其它的朋友反馈过这个问题。
博主写这篇文章时,unihttp的版本是0.2.3。看issue,遇到这个问题的朋友还不止一两个,享受开源项目的便利的同时,也要有一些包容。也期待博主可以早日兼容这种模式。对于需要在生产中引入这个组件的朋友,如果不是非常必要,不要开启开发者工具的热加载。如果必须要引用的,建议可以将工程按功能分开,这样做到方法隔离。
三、总结
以上就是本文的主要内容,本文将对在SpringBoot中集成UniHttp时遇到的无法启动的问题进行详细记录和分析。通过对这些问题的深入探讨,希望能够为其他开发者提供一些有价值的参考和借鉴,帮助他们在项目开发过程中更加顺利地使用UniHttp,充分发挥其优势,提高开发效率和项目质量。如果您在开发中也遇到这个问题,来这里看看吧。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。