springboot亲测rest协议支持,date类型返回

今天花了一下午的时间搞了一下dubbo service支持http访问的demo
从dubbo 2.6.0 开始dubbo已经支持了http访问service的,网上也找了一下我的环境是springboot+dubbo的,网上的dubbo都是用xml去配置的,我的是springboot没有xml

1)修改配置

注释原来的dubbo配置

  1. #spring.dubbo.protocol.name = dubbo
  2. #spring.dubbo.protocol.port = 21017

修改成

  1. spring.dubbo.protocols.dubbo.name=dubbo
  2. spring.dubbo.protocols.dubbo.port=21017
  3. spring.dubbo.protocols.rest.name=rest
  4. spring.dubbo.protocols.rest.port=31017
  5. spring.dubbo.protocols.rest.server=tomcat

2)添加依赖

  1. <dependency>
  2. <groupId>javax.ws.rs</groupId>
  3. <artifactId>javax.ws.rs-api</artifactId>
  4. <version>2.0</version>
  5. </dependency>
  6. <!--<dependency>
  7. <groupId>org.jboss.resteasy</groupId>
  8. <artifactId>resteasy-jaxrs</artifactId>
  9. <version>3.0.19.Final</version>
  10. </dependency>-->
  11. <dependency>
  12. <groupId>org.jboss.resteasy</groupId>
  13. <artifactId>resteasy-client</artifactId>
  14. <version>3.0.19.Final</version>
  15. </dependency>
  16. <!--<dependency>
  17. <groupId>org.apache.httpcomponents</groupId>
  18. <artifactId>httpclient</artifactId>
  19. <version>4.5.2</version>
  20. </dependency>-->
  21. <!--<dependency>
  22. <groupId>com.alibaba</groupId>
  23. <artifactId>fastjson</artifactId>
  24. <version>1.2.7</version>
  25. </dependency>-->
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-tomcat</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.hibernate.validator</groupId>
  32. <artifactId>hibernate-validator</artifactId>
  33. <version>6.0.13.Final</version>
  34. </dependency>
  35. <!--<dependency>
  36. <groupId>javax.el</groupId>
  37. <artifactId>javax.el-api</artifactId>
  38. <version>3.0.1-b06</version>
  39. </dependency>-->
  40. <!--<dependency>
  41. <groupId>org.glassfish.web</groupId>
  42. <artifactId>javax.el</artifactId>
  43. <version>2.2.6</version>-->
  44. </dependency><!--解决返回数据变成json-->
  45. <!--<dependency>-->
  46. <!--<groupId>org.jboss.resteasy</groupId>-->
  47. <!--<artifactId>resteasy-jackson-provider</artifactId>-->
  48. <!--<version>${resteasy.version}</version>-->
  49. <!--</dependency>-->

3)修改实现类,官方也是这么建议的

  1. import javax.ws.rs.GET;
  2. import javax.ws.rs.Path;
  3. import javax.ws.rs.Produces;
  4. import javax.ws.rs.core.MediaType;
  5. /**
  6. * @Path 添加访问前缀 跟@RequestMapping这个注解差不多
  7. * @GET 使用get访问
  8. * @Produces 是指返回给消费者的时候,是以json格式返回,如果是对象,会自动转换成json
  9. * @Service 注解添加要支持的协议,上面的测试代码是支持两种协议
  10. * 官方文档 http://dubbo.apache.org/zh-cn/docs/user/references/protocol/rest.html
  11. */
  12. @Slf4j
  13. @Component
  14. @Service(interfaceClass = OrderDemoService.class,protocol = {"rest","dubbo"})
  15. @Path("/order")
  16. public class OrderDemoServiceImpl implements OrderDemoService {
  17. @Path("/get")
  18. @GET
  19. @Produces({MediaType.APPLICATION_JSON + "; " + MediaType.CHARSET_PARAMETER + "=UTF-8"})
  20. @Override
  21. public String getOrder() {
  22. return "www.phpsong.com";
  23. }
  24. }

我这测试通过了

4)JSON返会的问题

对象或map返回的时候会提示

  1. <!--解决返回数据变成json-->
  2. <dependency>
  3. <groupId>org.jboss.resteasy</groupId>
  4. <artifactId>resteasy-jackson-provider</artifactId>
  5. <version>3.0.19.Final</version>
  6. </dependency>

说一下网上找的资料不正确的

springboot+dubbo 多协议的配置

  1. dubbo.protocols.dubbo.name=dubbo
  2. dubbo.protocols.dubbo.port=20017
  3. dubbo.protocols.rest.name=rest
  4. dubbo.protocols.rest.port=30017
  5. dubbo.protocols.rest.server=tomcat

结果我启动的时候提示

  1. java.lang.NullPointerException: beanName=orderDemoServiceImpl, registry=rest not found in multi configs

还有一种配置是添加配置类

  1. @Configuration
  2. @Slf4j
  3. public class config {
  4.  
  5. @Bean("dubbo")
  6. public ProtocolConfig dubboProtocolConfig() {
  7. ProtocolConfig protocolConfig = new ProtocolConfig();
  8. protocolConfig.setName("dubbo");
  9. int port = 20016;
  10. log.info("dubbo provider dubbo port = {}", port);
  11. protocolConfig.setPort(port);
  12. protocolConfig.setId("dubbo");
  13. protocolConfig.setServer(null);
  14. return protocolConfig;
  15. }
  16.  
  17. @Bean("rest")
  18. public ProtocolConfig restProtocolConfig() {
  19. ProtocolConfig protocolConfig = new ProtocolConfig();
  20. protocolConfig.setName("rest");
  21. int port = 30016;
  22. log.info("dubbo provider rest port = {}", port);
  23. protocolConfig.setPort(port);
  24. protocolConfig.setId("rest");
  25. protocolConfig.setServer("tomcat");
  26. return protocolConfig;
  27. }
  28. }

还是一样的错误提示

  1. java.lang.NullPointerException: beanName=orderDemoServiceImpl, registry=rest not found in multi configs

大概的意思是说找不到rest协议的配置,因为我在@service注解上添加了rest协议的配置

最近在开发项目的时候发现springboot返回给前端的是时间戳,百度了一下这个问题,有两个解决方式
在它的get方法上也添加:
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+08:00”)

  1. @Data
  2. class Person{
  3. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
  4. private Date createTime;
  5. }

还有一种方式加到配置文件里,全局都有效

  1. spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
  2. spring.jackson.time-zone=GMT+8

第一行指定date输出格式为yyyy-MM-dd HH:mm:ss;
第二行指定时区,解决8小时的时间差问题。