springboot多模块项目启动报错, saller项目需用到api项目的接口, 而找不到下面是报错信息代码一和图一
显示原因是在saller中无法找到api系统中 ProductRpc, 但是, 我的saller的build.gradle中已经引入了api, 后来, 我在saller的启动类上加了 @ComponentScan(basePackages = "com.imooc.api") 这个注解, 就可以扫描到api了, 不会再报这个错误, 但不幸的是
ProductRpcService类的 @PostConstruct注解不起作用了, 也就是我项目启动的时候, 此注解下的代码不会执行
而我 saller相当于客户端---->调用api服务--->api中的接口已被manager(管理端)实现 代码五, 并调用manager自己的service层完成数据的获取, 为了 把 rpc 地址交给 Spring来管理, 又创建了一个配置类 代码六 .
首先, 启动manager项目, 然后再启动saller项目, 但是, 就是不会执行 @PostConstruct, 所以, 我也无法证明能不能连通rpc, 目前找不到原因, 也不报错, 只能等后天上班求助于公司架构师了.
未完待续....2018-10-6
================================
saller系统启动类代码二
saller系统的gradle配置文件 代码四
api系统代码三
代码一
2018-10-06 17:15:56.600 INFO 11628 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2018-10-06 17:15:56.636 INFO 11628 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-10-06 17:15:56.881 ERROR 11628 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Field productRpc in com.imooc.saller.service.ProductRpcService required a bean of type 'com.imooc.api.ProductRpc' that could not be found.
Action:
Consider defining a bean of type 'com.imooc.api.ProductRpc' in your configuration.
Disconnected from the target VM, address: '127.0.0.1:55880', transport: 'socket'
Process finished with exit code 1
代码二
@SpringBootApplication
@ComponentScan(basePackages = "com.imooc.api")
public class SallerApp {
public static void main(String[] args){
SpringApplication.run(SallerApp.class);
}
}
代码三
@JsonRpcService("rpc/products")
@Component
public interface ProductRpc {
/**
* 查询多个产品
* @param request
* @return
*/
Page query(ProductRpcRequest request);
/**
* 查询单个产品详情
* @param id
* @return
*/
Product findOne(String id);
}
代码四
dependencies{
compile project(":api")
compile project(":util")
compile project(":entity")
}
代码五
@Service
public class ProductRpcService {
private static Logger logger = LoggerFactory.getLogger(ProductRpcService.class);
@Autowired
private ProductRpc productRpc;
/**
* 查询所有商品 ---目前先不实现分页, 先只用list来接收查询到的信息
* @return
*/
public List findAll(){
//构建查询条件
ProductRpcRequest rpcRequest = new ProductRpcRequest();
rpcRequest.setStatusList(Arrays.asList(ProductStatus.IS_SELL.getDesc()));
Pageable pageable = new PageRequest(0,1000, Sort.Direction.DESC,"rewardRate");
rpcRequest.setPageable(pageable);
logger.info("RPC查询所有商品, 条件 : {}", rpcRequest);
Page result = this.productRpc.query(rpcRequest);
logger.info("RPC查询所有商品, 结果 : {}", result);
return result.getContent();
}
/**
* 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
* PreDestroy()方法在destroy()方法知性之后执行
*/
@PostConstruct
public void testFindAll(){
this.findAll();
}
代码六
@Configuration
public class RpcConfiguration {
private static Logger logger = LoggerFactory.getLogger(RpcConfiguration.class);
/**
* 导出一个jsonrpc client的一个代理
*/
/** 告诉spring, 创建一个jsonrpc的一个代理-- */
public AutoJsonRpcClientProxyCreator rpcClientProxyCreator(@Value("${rpc.manager.url}")String url){
AutoJsonRpcClientProxyCreator creator = new AutoJsonRpcClientProxyCreator();
try {
creator.setBaseUrl(new URL(url));
} catch (MalformedURLException e) {
logger.error("创建rpc服务地址错误 error = {}",e);
}
/** 增加包扫描路径 */
creator.setScanPackage(ProductRpc.class.getPackage().getName());
return creator;
}
}
图一