public Object bind()

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());
        }
    }