Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

DataType nested class

Aperta
#626 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
75/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
java
Ambito
api, backend

Direzione di ricerca

Start with TypeRegistryImpl.addDataType, TypeSchema.typeConvert/updateSchemaForClass, and JSONTransactionSerializer.createComponentInstance to trace how nested class names are registered and resolved. Reproduce the issue with the provided Outer.Inner contract and verify that schema generation and deserialization use the same reference key, with no missing registry definition.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug
Description

The Java contract API appears to use inconsistent names for nested @DataType classes when creating schema references and registering types.

TypeRegistryImpl.addDataType(Class<?>) registers a data type using DataTypeDefinitionImpl.getSimpleName(). For a nested class such as Outer.Inner, Class.getSimpleName() returns Inner, so the registry key is Inner.

However, TypeSchema.typeConvert(Class<?>) uses Class.getTypeName() and passes that name to updateSchemaForClass(...). For Outer.Inner, the class name contains Outer$Inner. In TypeSchema.updateSchemaForClass(...), this line:

schema.put("$ref", "#/components/schemas/" + className.substring(className.lastIndexOf('.') + 1));

produces:

#/components/schemas/Outer$Inner

instead of:

#/components/schemas/Inner

This creates a registry lookup mismatch. During deserialization, the schema reference resolves to Outer$Inner, but the type registry contains the data type under Inner. The lookup returns null, and JSONTransactionSerializer.createComponentInstance(...) then throws a NullPointerException when it tries to use the missing definition.

The reference mismatch can also be observed directly by calling TypeSchema.typeConvert(Outer.Inner.class) from a smart contract: its "$ref" is #/components/schemas/Outer$Inner, while the registry uses the key Inner.

Steps to reproduce
  1. Define a nested @DataType class:

    public class Outer {
        @DataType
        public static class Inner {
            @Property
            private String value;
    
            public Inner() {
            }
        }
    }
    
  2. Define a contract transaction that accepts the nested data type:

    @Contract(name = "NestedTypeContract")
    public class NestedTypeContract implements ContractInterface {
        @Transaction
        public Outer.Inner echo(final Context context, final Outer.Inner input) {
            return input;
        }
    
        @Transaction
        public String inspectSchema(final Context context) {
            return TypeSchema.typeConvert(Outer.Inner.class).getRef();
        }
    }
    
  3. Start the contract so the shim scans the @DataType class. The type registry registers Outer.Inner under its simple name:

    Inner
    
  4. Invoke inspectSchema. Observe that TypeSchema.typeConvert(Outer.Inner.class).getRef() returns:

    #/components/schemas/Outer$Inner
    

    This differs from the registry key, Inner.

  5. Submit the echo transaction with a JSON argument representing Outer.Inner:

    {"value":"test"}
    
  6. Observe that deserialization attempts to look up Outer$Inner in the type registry, gets null, and fails with a NullPointerException in JSONTransactionSerializer.createComponentInstance().

Lingua principale
Java
Stelle
322
Fork
210
Merge medio
15h 16m
PR unite (30g)
29

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di hyperledger/fabric-chaincode-java

Tutte le issue di hyperledger/fabric-chaincode-java

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.