在微服务开发中,我们会用到Fein调用公共api接口,但是在调用的时候难免会出现错误,如:
feign.FeignException: status 404 reading BrandClient#queryBrandById(Long); content:
调用后去查看微服务的提供方的控制台日志数据,发现,请求已经通过网关到达了微服务的提供方,并且数据库中也有查询的相关数据,但是接口调用方却怎么也接收不到返回值。排查了路径,注解,参数,函数,接口…最终还是没能请求到数据:
微服务提供方接口api:
消费者消费:
既然消费者的请求已经到达了微服务提供方,不用怀疑,消费者是不会有问题的,肯定是在微服务提供方。
既然确定了问题是在微服务提供者,此时我们就可以去微服务提供方对应模块排查。
微服务提供方自测controller控制器:
import com.xjitcm.PageResult;
import com.xjitcm.SaleSysItemServiceApplication;
import com.xjitcm.controller.BrandController;
import com.xjitcm.pojo.Brand;
import com.xjitcm.utils.JsonStrToMap;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import java.util.Map;
@SpringBootTest(classes = SaleSysItemServiceApplication.class)
public class TestBrandController {
BrandController brandController = new BrandController();
@Test
public void testBrandController(){
Brand brand = brandController.queryBrandById(1527L);
}
}
测试仍然没有通过,依然是请求到达,查询到了数据,但是无返回值:
此时我们就明白了,问题就在控制器层(controller),在ssm架构中,我们的控制器返回的是视图,但是在微服务架构开发中,控制器返回的不能再是视图了,而是一些数据(返回JSON,状态码等)。
因此,我们需要重新配置控制层,将控制层设置为可以返回数据,而不是视图。在ssm架构中开发时候,通常我们为了返回视图,在控制层我们使用的是@Controller注解,在微服务架构中我们要做的就是将@Controller注解替换为@RestController,这样就完成了我们的需求,返回数据。
注意:
api接口的注解和控制层的注解都要使用@RestController,否则,消费者调用接口无法拿到数据,本人就是在这个地方糊涂了。
参考的博文地址
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
注意:在controller类中,添加RestController后后台不能重定向页面,如果需要重定向页面,则需要使用Controller,在需要返会数据的方法上添加@ResponseBody