in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/BeanArgumentBinder.java [55:133]
public Object bind(ParameterMeta paramMeta, HttpRequest request, HttpResponse response) {
try {
BeanMeta beanMeta = getBeanMeta(paramMeta);
if (beanMeta == null) {
return null;
}
ConstructorMeta constructor = beanMeta.getConstructor();
ParameterMeta[] parameters = constructor.getParameters();
Object bean;
int len = parameters.length;
if (len == 0) {
bean = constructor.newInstance();
} else {
Object[] args = new Object[len];
for (int i = 0; i < len; i++) {
ParameterMeta parameter = parameters[i];
args[i] = parameter.isSimple() ? argumentResolver.resolve(parameter, request, response) : null;
}
bean = constructor.newInstance(args);
}
Node root = new Node(paramMeta.getName(), bean, beanMeta);
for (String paramName : request.parameterNames()) {
Node current = root;
List<String> parts = StringUtils.tokenizeToList(paramName, '.');
for (int i = 0, size = parts.size(); i < size; i++) {
if (current == null) {
break;
}
String name = parts.get(i);
Pair<String, String> pair = parseKeyParam(name);
if (pair == null) {
current = current.getChild(name);
if (i == 0 && current == null && name.equals(root.name)) {
current = root;
}
} else {
name = pair.getLeft();
current = current.getChild(name);
if (current == null) {
break;
}
String key = pair.getValue();
if (!key.isEmpty()) {
if (Character.isDigit(key.charAt(0))) {
try {
current = current.getChild(Long.parseLong(key));
continue;
} catch (NumberFormatException ignored) {
}
}
current = current.getChild(key);
}
}
}
if (current == null) {
continue;
}
Class<?> type = current.paramMeta.getActualType();
Object value;
if (type.isArray() || Collection.class.isAssignableFrom(type)) {
value = request.parameterValues(paramName);
} else {
value = request.parameter(paramName);
}
//noinspection unchecked
current.setValue(argumentResolver.getArgumentConverter().convert(value, current.paramMeta));
}
for (PropertyMeta propertyMeta : beanMeta.getProperties()) {
resolveParam(propertyMeta, bean, request, response);
}
return bean;
} catch (Exception e) {
throw new RestException(e, Messages.ARGUMENT_BIND_ERROR, paramMeta.getName(), paramMeta.getType());
}
}