问题复现
今天发现一个问题 有一个 dubbo 接口返回类型是 boolean。把接口从同步改成异步 server 端返回 true,消费端却返回 false。把 boolean 改成 Boolean 就能正常返回结果。有碰到过这个问题吗?
注意几个重点:
-
接口返回类型是 boolean;
-
同步改为异步调用,返回的 boolean 和预期不符合;
-
boolean 基本类型改成包装类型 Boolean 就能正常返回。
《Java开发手册》中就强调了 RPC 接口返回最好不要使用基本类型,而要使用包装类型:
知道怎么写的就好办了,写个 Demo 先:
1) 定义 Dubbo 接口,一个返回 boolean,一个返回 Boolean。
public interface DemoService {
boolean isUser();
Boolean isFood();
}
2) 实现 Provider,为了简单,都返回 true,并且打了日志。
@Service
public class DemoServiceImpl implements DemoService {
@Override
public boolean isUser() {
System.out.println("server is user : true");
return true;
}
@Override
public Boolean isFood() {
System.out.println("server is food : true");
return true;
}
}
3) 实现 Consumer。
为了方便调用,实现了一个 Controller,为了防止本机调用,injvm 设置为 false。这里是经验,injvm 调用逻辑和远程调用区别挺大,为了防止干扰,统一远程调用。
@RestController
public class DemoCallerService {
@Reference(injv