{"record":{"id":"345455089208776f","repo":"apache/incubator-seata","slug":"couldn-t-parser-any-remoting-info","errorCode":null,"errorMessage":"Couldn't parser any Remoting info","messagePattern":"Couldn't parser any Remoting info","errorType":"exception","errorClass":"FrameworkException","httpStatus":null,"severity":"error","filePath":"compatible/src/main/java/io/seata/rm/tcc/remoting/parser/LocalTCCRemotingParser.java","lineNumber":63,"sourceCode":"        Class<?> classType = bean.getClass();\n        // check if LocalTCC annotation is marked on the implementation class\n        if (classType.isAnnotationPresent(LocalTCC.class)) {\n            remotingDesc.setServiceClass(AopProxyUtils.ultimateTargetClass(bean));\n            remotingDesc.setServiceClassName(remotingDesc.getServiceClass().getName());\n            remotingDesc.setTargetBean(bean);\n            return remotingDesc;\n        }\n        // check if LocalTCC annotation is marked on the interface\n        Set<Class<?>> interfaceClasses = ReflectionUtil.getInterfaces(classType);\n        for (Class<?> interClass : interfaceClasses) {\n            if (interClass.isAnnotationPresent(LocalTCC.class)) {\n                remotingDesc.setServiceClassName(interClass.getName());\n                remotingDesc.setServiceClass(interClass);\n                remotingDesc.setTargetBean(bean);\n                return remotingDesc;\n            }\n        }\n        throw new FrameworkException(\"Couldn't parser any Remoting info\");\n    }\n\n    @Override\n    public boolean isService(Class<?> beanClass) throws FrameworkException {\n        return isLocalTCC(beanClass);\n    }\n\n    @Override\n    public boolean isReference(Object bean, String beanName) {\n        return isLocalTCC(bean);\n    }\n\n    private boolean isLocalTCC(Object bean) {\n        Class<?> classType = bean.getClass();\n        return isLocalTCC(classType);\n    }\n\n    private boolean isLocalTCC(Class<?> classType) {","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/apache/incubator-seata/blob/e01f97c6db397165050caa6764020410c2c8199a/compatible/src/main/java/io/seata/rm/tcc/remoting/parser/LocalTCCRemotingParser.java#L45-L81","documentation":"Thrown by LocalTCCRemotingParser.getServiceDesc when a bean is processed as a local TCC service but neither its class nor any implemented interface carries the @LocalTCC annotation. The parser builds a RemotingDesc from the annotation; with none found there is no remoting metadata to return, which is treated as a framework error rather than a silent skip.","triggerScenarios":"The parser reaches getServiceDesc for a bean where isService/isReference previously matched (e.g. heuristic bean scanning or another parser delegating), but getInterfaces(classType) yields no @LocalTCC-annotated interface and the class itself lacks it.","commonSituations":"@LocalTCC placed on the implementation class but the bean is a JDK dynamic proxy implementing only the interface; annotation on a non-implemented interface; scanning picking up unrelated beans after config changes; renaming/moving the TCC interface so it no longer matches.","solutions":["Put @LocalTCC on the TCC interface the bean implements (canonical placement), not only on the impl class.","Verify the scanned bean actually implements that interface (check proxy type: JDK proxy exposes interfaces only).","If the bean is not meant to be TCC, narrow the parser/scanner scope so it is not picked up.","After moving/renaming interfaces, rebuild so reflection metadata is current."],"exampleFix":"// before: annotation only on impl, bean proxied by JDK proxy on the interface\n@Service\n@LocalTCC\npublic class OrderTccActionImpl implements OrderTccAction { ... }\n\n// after: annotate the interface\n@LocalTCC\npublic interface OrderTccAction {\n    @TwoPhaseBusinessAction(name = \"orderTcc\", commitMethod = \"commit\", rollbackMethod = \"rollback\")\n    boolean prepare(BusinessActionContext ctx, Long orderId);\n    boolean commit(BusinessActionContext ctx);\n    boolean rollback(BusinessActionContext ctx);\n}","handlingStrategy":"validation","validationCode":"boolean isLocalTccBean(Object bean) {\n    Class<?> c = bean.getClass();\n    if (c.isAnnotationPresent(LocalTCC.class)) return true;\n    for (Class<?> i : c.getInterfaces()) {\n        if (i.isAnnotationPresent(LocalTCC.class)) return true;\n    }\n    return false;\n}","typeGuard":null,"tryCatchPattern":"try {\n    RemotingDesc desc = parser.getServiceDesc(bean, beanName);\n} catch (FrameworkException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"Remoting info\")) {\n        LOGGER.debug(\"{} is not a LocalTCC bean; skipping\", beanName);\n        return null;\n    }\n    throw e;\n}","preventionTips":["Put @LocalTCC on the interface, the canonical placement for local TCC.","If scanning beans broadly, tolerate 'Couldn't parser any Remoting info' for non-TCC beans by catching and skipping.","After moving TCC interfaces, verify the bean still implements them (esp. behind JDK proxies)."],"tags":["tcc","local-tcc","annotation","proxy","spring"],"backgroundTag":null,"analyzedSha":"e01f97c6db397165050caa6764020410c2c8199a","analyzedAt":"2026-08-14T10:23:53.097Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}