Search in sources :

Example 6 with JavaBeanDescriptor

use of com.alibaba.dubbo.common.beanutil.JavaBeanDescriptor in project dubbo by alibaba.

the class GenericImplFilter method invoke.

public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
    String generic = invoker.getUrl().getParameter(Constants.GENERIC_KEY);
    if (ProtocolUtils.isGeneric(generic) && !Constants.$INVOKE.equals(invocation.getMethodName()) && invocation instanceof RpcInvocation) {
        RpcInvocation invocation2 = (RpcInvocation) invocation;
        String methodName = invocation2.getMethodName();
        Class<?>[] parameterTypes = invocation2.getParameterTypes();
        Object[] arguments = invocation2.getArguments();
        String[] types = new String[parameterTypes.length];
        for (int i = 0; i < parameterTypes.length; i++) {
            types[i] = ReflectUtils.getName(parameterTypes[i]);
        }
        Object[] args;
        if (ProtocolUtils.isBeanGenericSerialization(generic)) {
            args = new Object[arguments.length];
            for (int i = 0; i < arguments.length; i++) {
                args[i] = JavaBeanSerializeUtil.serialize(arguments[i], JavaBeanAccessor.METHOD);
            }
        } else {
            args = PojoUtils.generalize(arguments);
        }
        invocation2.setMethodName(Constants.$INVOKE);
        invocation2.setParameterTypes(GENERIC_PARAMETER_TYPES);
        invocation2.setArguments(new Object[] { methodName, types, args });
        Result result = invoker.invoke(invocation2);
        if (!result.hasException()) {
            Object value = result.getValue();
            try {
                Method method = invoker.getInterface().getMethod(methodName, parameterTypes);
                if (ProtocolUtils.isBeanGenericSerialization(generic)) {
                    if (value == null) {
                        return new RpcResult(value);
                    } else if (value instanceof JavaBeanDescriptor) {
                        return new RpcResult(JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) value));
                    } else {
                        throw new RpcException(new StringBuilder(64).append("The type of result value is ").append(value.getClass().getName()).append(" other than ").append(JavaBeanDescriptor.class.getName()).append(", and the result is ").append(value).toString());
                    }
                } else {
                    return new RpcResult(PojoUtils.realize(value, method.getReturnType(), method.getGenericReturnType()));
                }
            } catch (NoSuchMethodException e) {
                throw new RpcException(e.getMessage(), e);
            }
        } else if (result.getException() instanceof GenericException) {
            GenericException exception = (GenericException) result.getException();
            try {
                String className = exception.getExceptionClass();
                Class<?> clazz = ReflectUtils.forName(className);
                Throwable targetException = null;
                Throwable lastException = null;
                try {
                    targetException = (Throwable) clazz.newInstance();
                } catch (Throwable e) {
                    lastException = e;
                    for (Constructor<?> constructor : clazz.getConstructors()) {
                        try {
                            targetException = (Throwable) constructor.newInstance(new Object[constructor.getParameterTypes().length]);
                            break;
                        } catch (Throwable e1) {
                            lastException = e1;
                        }
                    }
                }
                if (targetException != null) {
                    try {
                        Field field = Throwable.class.getDeclaredField("detailMessage");
                        if (!field.isAccessible()) {
                            field.setAccessible(true);
                        }
                        field.set(targetException, exception.getExceptionMessage());
                    } catch (Throwable e) {
                        logger.warn(e.getMessage(), e);
                    }
                    result = new RpcResult(targetException);
                } else if (lastException != null) {
                    throw lastException;
                }
            } catch (Throwable e) {
                throw new RpcException("Can not deserialize exception " + exception.getExceptionClass() + ", message: " + exception.getExceptionMessage(), e);
            }
        }
        return result;
    }
    if (invocation.getMethodName().equals(Constants.$INVOKE) && invocation.getArguments() != null && invocation.getArguments().length == 3 && ProtocolUtils.isGeneric(generic)) {
        Object[] args = (Object[]) invocation.getArguments()[2];
        if (ProtocolUtils.isJavaGenericSerialization(generic)) {
            for (Object arg : args) {
                if (!(byte[].class == arg.getClass())) {
                    error(byte[].class.getName(), arg.getClass().getName());
                }
            }
        } else if (ProtocolUtils.isBeanGenericSerialization(generic)) {
            for (Object arg : args) {
                if (!(arg instanceof JavaBeanDescriptor)) {
                    error(JavaBeanDescriptor.class.getName(), arg.getClass().getName());
                }
            }
        }
        ((RpcInvocation) invocation).setAttachment(Constants.GENERIC_KEY, invoker.getUrl().getParameter(Constants.GENERIC_KEY));
    }
    return invoker.invoke(invocation);
}
Also used : RpcInvocation(com.alibaba.dubbo.rpc.RpcInvocation) RpcResult(com.alibaba.dubbo.rpc.RpcResult) Method(java.lang.reflect.Method) GenericException(com.alibaba.dubbo.rpc.service.GenericException) Result(com.alibaba.dubbo.rpc.Result) RpcResult(com.alibaba.dubbo.rpc.RpcResult) Field(java.lang.reflect.Field) JavaBeanDescriptor(com.alibaba.dubbo.common.beanutil.JavaBeanDescriptor) RpcException(com.alibaba.dubbo.rpc.RpcException)

Example 7 with JavaBeanDescriptor

use of com.alibaba.dubbo.common.beanutil.JavaBeanDescriptor in project brave by openzipkin.

the class ITTracingFilter_Provider method setup.

@Before
public void setup() {
    server.service.setFilter("tracing");
    server.service.setInterface(GreeterService.class);
    server.service.setRef((method, parameterTypes, args) -> {
        JavaBeanDescriptor arg = (JavaBeanDescriptor) args[0];
        if (arg.getProperty("value").equals("bad")) {
            throw new IllegalArgumentException("bad");
        }
        String value = currentTraceContext.get() != null ? currentTraceContext.get().traceIdString() : "";
        arg.setProperty("value", value);
        return args[0];
    });
    server.start();
    ReferenceConfig<GreeterService> ref = new ReferenceConfig<>();
    ref.setApplication(new ApplicationConfig("bean-consumer"));
    ref.setInterface(GreeterService.class);
    ref.setUrl("dubbo://" + server.ip() + ":" + server.port() + "?scope=remote&generic=bean");
    client = ref;
    init();
}
Also used : JavaBeanDescriptor(com.alibaba.dubbo.common.beanutil.JavaBeanDescriptor) ApplicationConfig(com.alibaba.dubbo.config.ApplicationConfig) ReferenceConfig(com.alibaba.dubbo.config.ReferenceConfig) Before(org.junit.Before)

Aggregations

JavaBeanDescriptor (com.alibaba.dubbo.common.beanutil.JavaBeanDescriptor)7 Result (com.alibaba.dubbo.rpc.Result)4 Test (org.junit.Test)4 ApplicationConfig (com.alibaba.dubbo.config.ApplicationConfig)3 ReferenceConfig (com.alibaba.dubbo.config.ReferenceConfig)3 RpcException (com.alibaba.dubbo.rpc.RpcException)3 GenericException (com.alibaba.dubbo.rpc.service.GenericException)3 Before (org.junit.Before)3 Tag (brave.Tag)2 SamplingFlags (brave.propagation.SamplingFlags)2 TraceContext (brave.propagation.TraceContext)2 RpcRequestMatchers.methodEquals (brave.rpc.RpcRequestMatchers.methodEquals)2 RpcRequestMatchers.serviceEquals (brave.rpc.RpcRequestMatchers.serviceEquals)2 RpcResponseParser (brave.rpc.RpcResponseParser)2 RpcRuleSampler (brave.rpc.RpcRuleSampler)2 RpcTracing (brave.rpc.RpcTracing)2 ALWAYS_SAMPLE (brave.sampler.Sampler.ALWAYS_SAMPLE)2 NEVER_SAMPLE (brave.sampler.Sampler.NEVER_SAMPLE)2 DemoService (com.alibaba.dubbo.config.api.DemoService)2 User (com.alibaba.dubbo.config.api.User)2