private FieldRequirement fieldRequirement(JavaType classType, JavaType fieldType, String fieldName) {
        if (fieldType.isPrimitive()) {
            return FieldRequirement.REQUIRED;
        }

        if (KotlinUtil.isData(classType.getRawClass())) {
            // Only the parameters in the constructor of data classes correctly provide
            // `isMarkedNullable` information.
            final FieldRequirement requirement =
                    extractFromConstructor(classType, fieldType, fieldName, parameter -> {
                        if (isNullable(parameter)) {
                            return FieldRequirement.OPTIONAL;
                        } else {
                            return FieldRequirement.REQUIRED;
                        }
                    });
            if (requirement != null) {
                return requirement;
            }
        }

        final FieldRequirement requirement =
                extractFieldMeta(classType, fieldType, fieldName, element -> {
                    if (request) {
                        if (element instanceof Method) {
                            // Use the first parameter information for the setter method
                            element = ((Method) element).getParameters()[0];
                        }
                    }
                    if (isNullable(element)) {
                        return FieldRequirement.OPTIONAL;
                    }
                    return FieldRequirement.REQUIRED;
                });

        return firstNonNull(requirement, FieldRequirement.UNSPECIFIED);
    }
A default {@link DescriptiveTypeInfoProvider} to create a {@link StructInfo} from a {@code typeDescriptor}.
If {@code typeDescriptor} is unknown type, Jackson is used to try to extract fields
and their metadata.
core/src/main/java/com/linecorp/armeria/internal/server/annotation/DefaultDescriptiveTypeInfoProvider.java