Search in sources :

Example 1 with Type

use of io.micronaut.context.annotation.Type in project micronaut-core by micronaut-projects.

the class ObjectMapperFactory method objectMapper.

/**
 * Builds the core Jackson {@link ObjectMapper} from the optional configuration and {@link JsonFactory}.
 *
 * @param jacksonConfiguration The configuration
 * @param jsonFactory          The JSON factory
 * @return The {@link ObjectMapper}
 */
@Singleton
@Primary
@Named("json")
@BootstrapContextCompatible
public ObjectMapper objectMapper(@Nullable JacksonConfiguration jacksonConfiguration, @Nullable JsonFactory jsonFactory) {
    ObjectMapper objectMapper = new ObjectMapper(jsonFactory, null, new DefaultDeserializationContext.Impl(new ResilientBeanDeserializerFactory(new DeserializerFactoryConfig())));
    final boolean hasConfiguration = jacksonConfiguration != null;
    if (!hasConfiguration || jacksonConfiguration.isModuleScan()) {
        objectMapper.findAndRegisterModules();
    }
    objectMapper.registerModules(jacksonModules);
    SimpleModule module = new SimpleModule(MICRONAUT_MODULE);
    for (JsonSerializer serializer : serializers) {
        Class<? extends JsonSerializer> type = serializer.getClass();
        Type annotation = type.getAnnotation(Type.class);
        if (annotation != null) {
            Class[] value = annotation.value();
            for (Class aClass : value) {
                module.addSerializer(aClass, serializer);
            }
        } else {
            Optional<Class> targetType = GenericTypeUtils.resolveSuperGenericTypeArgument(type);
            if (targetType.isPresent()) {
                module.addSerializer(targetType.get(), serializer);
            } else {
                module.addSerializer(serializer);
            }
        }
    }
    for (JsonDeserializer deserializer : deserializers) {
        Class<? extends JsonDeserializer> type = deserializer.getClass();
        Type annotation = type.getAnnotation(Type.class);
        if (annotation != null) {
            Class[] value = annotation.value();
            for (Class aClass : value) {
                module.addDeserializer(aClass, deserializer);
            }
        } else {
            Optional<Class> targetType = GenericTypeUtils.resolveSuperGenericTypeArgument(type);
            targetType.ifPresent(aClass -> module.addDeserializer(aClass, deserializer));
        }
    }
    if (hasConfiguration && jacksonConfiguration.isTrimStrings()) {
        module.addDeserializer(String.class, new StringDeserializer() {

            @Override
            public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
                String value = super.deserialize(p, ctxt);
                return StringUtils.trimToNull(value);
            }
        });
    }
    for (KeyDeserializer keyDeserializer : keyDeserializers) {
        Class<? extends KeyDeserializer> type = keyDeserializer.getClass();
        Type annotation = type.getAnnotation(Type.class);
        if (annotation != null) {
            Class[] value = annotation.value();
            for (Class clazz : value) {
                module.addKeyDeserializer(clazz, keyDeserializer);
            }
        }
    }
    objectMapper.registerModule(module);
    for (BeanSerializerModifier beanSerializerModifier : beanSerializerModifiers) {
        objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(beanSerializerModifier));
    }
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    objectMapper.configure(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS, true);
    if (hasConfiguration) {
        ObjectMapper.DefaultTyping defaultTyping = jacksonConfiguration.getDefaultTyping();
        if (defaultTyping != null) {
            objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), defaultTyping);
        }
        JsonInclude.Include include = jacksonConfiguration.getSerializationInclusion();
        if (include != null) {
            objectMapper.setSerializationInclusion(include);
        }
        String dateFormat = jacksonConfiguration.getDateFormat();
        if (dateFormat != null) {
            objectMapper.setDateFormat(new SimpleDateFormat(dateFormat));
        }
        Locale locale = jacksonConfiguration.getLocale();
        if (locale != null) {
            objectMapper.setLocale(locale);
        }
        TimeZone timeZone = jacksonConfiguration.getTimeZone();
        if (timeZone != null) {
            objectMapper.setTimeZone(timeZone);
        }
        PropertyNamingStrategy propertyNamingStrategy = jacksonConfiguration.getPropertyNamingStrategy();
        if (propertyNamingStrategy != null) {
            objectMapper.setPropertyNamingStrategy(propertyNamingStrategy);
        }
        jacksonConfiguration.getSerializationSettings().forEach(objectMapper::configure);
        jacksonConfiguration.getDeserializationSettings().forEach(objectMapper::configure);
        jacksonConfiguration.getMapperSettings().forEach(objectMapper::configure);
        jacksonConfiguration.getParserSettings().forEach(objectMapper::configure);
        jacksonConfiguration.getGeneratorSettings().forEach(objectMapper::configure);
    }
    return objectMapper;
}
Also used : Locale(java.util.Locale) DefaultDeserializationContext(com.fasterxml.jackson.databind.deser.DefaultDeserializationContext) JsonInclude(com.fasterxml.jackson.annotation.JsonInclude) JsonSerializer(com.fasterxml.jackson.databind.JsonSerializer) JsonDeserializer(com.fasterxml.jackson.databind.JsonDeserializer) KeyDeserializer(com.fasterxml.jackson.databind.KeyDeserializer) DefaultDeserializationContext(com.fasterxml.jackson.databind.deser.DefaultDeserializationContext) DeserializationContext(com.fasterxml.jackson.databind.DeserializationContext) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) BeanSerializerModifier(com.fasterxml.jackson.databind.ser.BeanSerializerModifier) JsonParser(com.fasterxml.jackson.core.JsonParser) DeserializerFactoryConfig(com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig) StringDeserializer(com.fasterxml.jackson.databind.deser.std.StringDeserializer) IOException(java.io.IOException) Type(io.micronaut.context.annotation.Type) TimeZone(java.util.TimeZone) PropertyNamingStrategy(com.fasterxml.jackson.databind.PropertyNamingStrategy) SimpleDateFormat(java.text.SimpleDateFormat) SimpleModule(com.fasterxml.jackson.databind.module.SimpleModule) Named(jakarta.inject.Named) BootstrapContextCompatible(io.micronaut.context.annotation.BootstrapContextCompatible) Singleton(jakarta.inject.Singleton) Primary(io.micronaut.context.annotation.Primary)

Example 2 with Type

use of io.micronaut.context.annotation.Type in project helidon by oracle.

the class MicronautCdiExtension method processTypes.

/**
 * Construct a list of Micronaut interceptors to execute on each CDI method.
 * In case a Micronaut bean definition is available for the CDI bean (which should be for application, as
 * the CDI annotation processor should be used, and it adds CDI beans as Micronaut beans), the information
 * is combined from Micronaut and CDI bean definitions.
 *
 * @param event CDI event
 */
@SuppressWarnings("unchecked")
void processTypes(@Priority(PLATFORM_AFTER) @Observes ProcessAnnotatedType<?> event) {
    Set<Class<?>> classInterceptors = new HashSet<>();
    Map<Method, Set<Class<?>>> allMethodInterceptors = new HashMap<>();
    List<MicronautBean> miBeans = unprocessedBeans.remove(event.getAnnotatedType().getJavaClass());
    if (miBeans != null && miBeans.size() > 0) {
        BeanDefinitionReference<?> miBean = findMicronautBeanDefinition(miBeans);
        // add all interceptors that are seen based on Micronaut
        findMicronautInterceptors(classInterceptors, allMethodInterceptors, miBean);
    }
    // find all annotations that have meta annotation Around and collect their Type list to add as interceptors
    addMicronautInterceptors(classInterceptors, event.getAnnotatedType().getAnnotations());
    // for each method, find the same (Around, collect Type), and add the interceptor binding for Micronaut interceptors
    // CDI interceptors will be automatic
    event.configureAnnotatedType().methods().forEach(method -> {
        Method javaMethod = method.getAnnotated().getJavaMember();
        Set<Class<?>> methodInterceptors = allMethodInterceptors.computeIfAbsent(javaMethod, it -> new HashSet<>());
        methodInterceptors.addAll(classInterceptors);
        addMicronautInterceptors(methodInterceptors, method.getAnnotated().getAnnotations());
        if (!methodInterceptors.isEmpty()) {
            // now I have a set of micronaut interceptors that are needed for this method
            method.add(MicronautIntercepted.Literal.INSTANCE);
            Set<Class<? extends MethodInterceptor<?, ?>>> interceptors = new HashSet<>();
            methodInterceptors.forEach(it -> interceptors.add((Class<? extends MethodInterceptor<?, ?>>) it));
            methods.computeIfAbsent(javaMethod, theMethod -> MethodInterceptorMetadata.create(method.getAnnotated(), executableMethodCache.get(theMethod))).addInterceptors(interceptors);
        }
    });
}
Also used : Dependent(jakarta.enterprise.context.Dependent) Around(io.micronaut.aop.Around) Observes(jakarta.enterprise.event.Observes) ApplicationScoped(jakarta.enterprise.context.ApplicationScoped) HashMap(java.util.HashMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) ExecutableMethod(io.micronaut.inject.ExecutableMethod) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) HashSet(java.util.HashSet) SoftServiceLoader(io.micronaut.core.io.service.SoftServiceLoader) ApplicationContext(io.micronaut.context.ApplicationContext) Extension(jakarta.enterprise.inject.spi.Extension) ProcessAnnotatedType(jakarta.enterprise.inject.spi.ProcessAnnotatedType) BeforeBeanDiscovery(jakarta.enterprise.inject.spi.BeforeBeanDiscovery) MethodInterceptor(io.micronaut.aop.MethodInterceptor) Map(java.util.Map) PLATFORM_AFTER(jakarta.interceptor.Interceptor.Priority.PLATFORM_AFTER) BeanConfigurator(jakarta.enterprise.inject.spi.configurator.BeanConfigurator) Priority(jakarta.annotation.Priority) LinkedList(java.util.LinkedList) Method(java.lang.reflect.Method) Initialized(jakarta.enterprise.context.Initialized) PLATFORM_BEFORE(jakarta.interceptor.Interceptor.Priority.PLATFORM_BEFORE) Iterator(java.util.Iterator) PropertySource(io.micronaut.context.env.PropertySource) Collection(java.util.Collection) ServiceDefinition(io.micronaut.core.io.service.ServiceDefinition) Set(java.util.Set) Qualifiers(io.micronaut.inject.qualifiers.Qualifiers) AdvisedBeanType(io.micronaut.inject.AdvisedBeanType) Config(org.eclipse.microprofile.config.Config) Logger(java.util.logging.Logger) Collectors(java.util.stream.Collectors) BeforeDestroyed(jakarta.enterprise.context.BeforeDestroyed) Objects(java.util.Objects) List(java.util.List) Type(io.micronaut.context.annotation.Type) Stream(java.util.stream.Stream) AfterBeanDiscovery(jakarta.enterprise.inject.spi.AfterBeanDiscovery) Annotation(java.lang.annotation.Annotation) AnnotationMetadata(io.micronaut.core.annotation.AnnotationMetadata) BeanDefinition(io.micronaut.inject.BeanDefinition) Comparator(java.util.Comparator) Qualifier(jakarta.inject.Qualifier) BeanDefinitionReference(io.micronaut.inject.BeanDefinitionReference) HashSet(java.util.HashSet) Set(java.util.Set) HashMap(java.util.HashMap) ExecutableMethod(io.micronaut.inject.ExecutableMethod) Method(java.lang.reflect.Method) MethodInterceptor(io.micronaut.aop.MethodInterceptor) HashSet(java.util.HashSet)

Example 3 with Type

use of io.micronaut.context.annotation.Type in project micronaut-core by micronaut-projects.

the class InterceptorChain method resolveInterceptorsInternal.

private static Interceptor[] resolveInterceptorsInternal(ExecutableMethod<?, ?> method, Class<? extends Annotation> annotationType, Interceptor[] interceptors, @NonNull ClassLoader classLoader) {
    List<Class<? extends Annotation>> annotations = method.getAnnotationTypesByStereotype(annotationType, classLoader);
    Set<Class> applicableClasses = new HashSet<>();
    for (Class<? extends Annotation> aClass : annotations) {
        if (annotationType == Around.class && aClass.getAnnotation(Around.class) == null && aClass.getAnnotation(Introduction.class) != null) {
            continue;
        } else if (annotationType == Introduction.class && aClass.getAnnotation(Introduction.class) == null && aClass.getAnnotation(Around.class) != null) {
            continue;
        }
        Type typeAnn = aClass.getAnnotation(Type.class);
        if (typeAnn != null) {
            applicableClasses.addAll(Arrays.asList(typeAnn.value()));
        }
    }
    Interceptor[] interceptorArray = Arrays.stream(interceptors).filter(i -> applicableClasses.stream().anyMatch(t -> t.isInstance(i))).toArray(Interceptor[]::new);
    OrderUtil.sort(interceptorArray);
    return interceptorArray;
}
Also used : OrderUtil(io.micronaut.core.order.OrderUtil) java.util(java.util) BeanRegistration(io.micronaut.context.BeanRegistration) io.micronaut.aop(io.micronaut.aop) BeanContext(io.micronaut.context.BeanContext) ArrayUtils(io.micronaut.core.util.ArrayUtils) ExecutableMethod(io.micronaut.inject.ExecutableMethod) Type(io.micronaut.context.annotation.Type) ApplicationContext(io.micronaut.context.ApplicationContext) EnvironmentConfigurable(io.micronaut.context.EnvironmentConfigurable) Annotation(java.lang.annotation.Annotation) UnimplementedAdviceException(io.micronaut.aop.exceptions.UnimplementedAdviceException) Argument(io.micronaut.core.type.Argument) io.micronaut.core.annotation(io.micronaut.core.annotation) Type(io.micronaut.context.annotation.Type) Annotation(java.lang.annotation.Annotation)

Aggregations

Type (io.micronaut.context.annotation.Type)3 ApplicationContext (io.micronaut.context.ApplicationContext)2 ExecutableMethod (io.micronaut.inject.ExecutableMethod)2 JsonInclude (com.fasterxml.jackson.annotation.JsonInclude)1 JsonParser (com.fasterxml.jackson.core.JsonParser)1 DeserializationContext (com.fasterxml.jackson.databind.DeserializationContext)1 JsonDeserializer (com.fasterxml.jackson.databind.JsonDeserializer)1 JsonSerializer (com.fasterxml.jackson.databind.JsonSerializer)1 KeyDeserializer (com.fasterxml.jackson.databind.KeyDeserializer)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 PropertyNamingStrategy (com.fasterxml.jackson.databind.PropertyNamingStrategy)1 DeserializerFactoryConfig (com.fasterxml.jackson.databind.cfg.DeserializerFactoryConfig)1 DefaultDeserializationContext (com.fasterxml.jackson.databind.deser.DefaultDeserializationContext)1 StringDeserializer (com.fasterxml.jackson.databind.deser.std.StringDeserializer)1 SimpleModule (com.fasterxml.jackson.databind.module.SimpleModule)1 BeanSerializerModifier (com.fasterxml.jackson.databind.ser.BeanSerializerModifier)1 io.micronaut.aop (io.micronaut.aop)1 Around (io.micronaut.aop.Around)1 MethodInterceptor (io.micronaut.aop.MethodInterceptor)1 UnimplementedAdviceException (io.micronaut.aop.exceptions.UnimplementedAdviceException)1