1、首先看下面代码:

1
2
3
4
5
6
public class CreateOrgNotifyEventListener extends AbstractOnsEventListener<CreateOrgNotifyEventPayload> {
@Override
public void onEventInternal(OnsMessageEvent<CreateOrgNotifyEventPayload> event) {
CreateOrgNotifyEventPayload payload = JSON.parseObject(String.valueOf(event.getPayload()), CreateOrgNotifyEventPayload.class);
}
}

2、代码中event.getPayload()会返回泛型T即CreateOrgNotifyEventPayload类型,但是却不能直接用如下代码获取CreateOrgNotifyEventPayload,会触发ClassCastException: String不能强转为CreateOrgNotifyEventPayload。

1
2
2.1CreateOrgNotifyEventPayload payload = event.getPayload();
2.2CreateOrgNotifyEventPayload payload = JSON.parseObject(event.getPayload().toString(), CreateOrgNotifyEventPayload.class);

3、因为payload为String类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface OnsMessageEvent<T> {
T getPayload();
}

public abstract class AbstractOnsMessageEvent<T> implements OnsMessageEvent<T> {
private T payload;
}

private OnsMessageEvent messageToOnsMessageEvent(Message message) {
String payload = new String(message.getBody(), StandardCharsets.UTF_8);
defaultOnsMessageEvent.setPayload(payload);
return defaultOnsMessageEvent;
}

分析:

第2部分代码中,2.1代码很好理解,2.2就有点意思了。

按理说所有的对象都实现了toString()方法,event.getPayload()真实数据类型也是String,为什么event.getPayload().toString()会出发ClassCastException呢?

而String.valueOf(event.getPayload())就没有问题,String.valueOf源码:

1
2
3
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

解决:

猜测泛型对象payload.toString()出错原因是方法执行顺序,先转CreateOrgNotifyEventPayload再执行toString();

而String.valueOf是跳过类型转换,直接执行toString()