springboot亲测rest协议支持,date类型返回
今天花了一下午的时间搞了一下dubbo service支持http访问的demo
从dubbo 2.6.0 开始dubbo已经支持了http访问service的,网上也找了一下我的环境是springboot+dubbo的,网上的dubbo都是用xml去配置的,我的是springboot没有xml
1)修改配置
注释原来的dubbo配置
- #spring.dubbo.protocol.name = dubbo
- #spring.dubbo.protocol.port = 21017
修改成
- spring.dubbo.protocols.dubbo.name=dubbo
- spring.dubbo.protocols.dubbo.port=21017
- spring.dubbo.protocols.rest.name=rest
- spring.dubbo.protocols.rest.port=31017
- spring.dubbo.protocols.rest.server=tomcat
2)添加依赖
- <dependency>
- <groupId>javax.ws.rs</groupId>
- <artifactId>javax.ws.rs-api</artifactId>
- <version>2.0</version>
- </dependency>
- <!--<dependency>
- <groupId>org.jboss.resteasy</groupId>
- <artifactId>resteasy-jaxrs</artifactId>
- <version>3.0.19.Final</version>
- </dependency>-->
- <dependency>
- <groupId>org.jboss.resteasy</groupId>
- <artifactId>resteasy-client</artifactId>
- <version>3.0.19.Final</version>
- </dependency>
- <!--<dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.2</version>
- </dependency>-->
- <!--<dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.7</version>
- </dependency>-->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- </dependency>
- <dependency>
- <groupId>org.hibernate.validator</groupId>
- <artifactId>hibernate-validator</artifactId>
- <version>6.0.13.Final</version>
- </dependency>
- <!--<dependency>
- <groupId>javax.el</groupId>
- <artifactId>javax.el-api</artifactId>
- <version>3.0.1-b06</version>
- </dependency>-->
- <!--<dependency>
- <groupId>org.glassfish.web</groupId>
- <artifactId>javax.el</artifactId>
- <version>2.2.6</version>-->
- </dependency><!--解决返回数据变成json-->
- <!--<dependency>-->
- <!--<groupId>org.jboss.resteasy</groupId>-->
- <!--<artifactId>resteasy-jackson-provider</artifactId>-->
- <!--<version>${resteasy.version}</version>-->
- <!--</dependency>-->
3)修改实现类,官方也是这么建议的
- import javax.ws.rs.GET;
- import javax.ws.rs.Path;
- import javax.ws.rs.Produces;
- import javax.ws.rs.core.MediaType;
- /**
- * @Path 添加访问前缀 跟@RequestMapping这个注解差不多
- * @GET 使用get访问
- * @Produces 是指返回给消费者的时候,是以json格式返回,如果是对象,会自动转换成json
- * @Service 注解添加要支持的协议,上面的测试代码是支持两种协议
- * 官方文档 http://dubbo.apache.org/zh-cn/docs/user/references/protocol/rest.html
- */
- @Slf4j
- @Component
- @Service(interfaceClass = OrderDemoService.class,protocol = {"rest","dubbo"})
- @Path("/order")
- public class OrderDemoServiceImpl implements OrderDemoService {
- @Path("/get")
- @GET
- @Produces({MediaType.APPLICATION_JSON + "; " + MediaType.CHARSET_PARAMETER + "=UTF-8"})
- @Override
- public String getOrder() {
- return "www.phpsong.com";
- }
- }
我这测试通过了
4)JSON返会的问题
对象或map返回的时候会提示
- <!--解决返回数据变成json-->
- <dependency>
- <groupId>org.jboss.resteasy</groupId>
- <artifactId>resteasy-jackson-provider</artifactId>
- <version>3.0.19.Final</version>
- </dependency>
说一下网上找的资料不正确的
springboot+dubbo 多协议的配置
- dubbo.protocols.dubbo.name=dubbo
- dubbo.protocols.dubbo.port=20017
- dubbo.protocols.rest.name=rest
- dubbo.protocols.rest.port=30017
- dubbo.protocols.rest.server=tomcat
结果我启动的时候提示
- java.lang.NullPointerException: beanName=orderDemoServiceImpl, registry=rest not found in multi configs
还有一种配置是添加配置类
- @Configuration
- @Slf4j
- public class config {
- @Bean("dubbo")
- public ProtocolConfig dubboProtocolConfig() {
- ProtocolConfig protocolConfig = new ProtocolConfig();
- protocolConfig.setName("dubbo");
- int port = 20016;
- log.info("dubbo provider dubbo port = {}", port);
- protocolConfig.setPort(port);
- protocolConfig.setId("dubbo");
- protocolConfig.setServer(null);
- return protocolConfig;
- }
- @Bean("rest")
- public ProtocolConfig restProtocolConfig() {
- ProtocolConfig protocolConfig = new ProtocolConfig();
- protocolConfig.setName("rest");
- int port = 30016;
- log.info("dubbo provider rest port = {}", port);
- protocolConfig.setPort(port);
- protocolConfig.setId("rest");
- protocolConfig.setServer("tomcat");
- return protocolConfig;
- }
- }
还是一样的错误提示
- 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”)
- @Data
- class Person{
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
- private Date createTime;
- }
还有一种方式加到配置文件里,全局都有效
- spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- spring.jackson.time-zone=GMT+8
第一行指定date输出格式为yyyy-MM-dd HH:mm:ss;
第二行指定时区,解决8小时的时间差问题。