Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bean introspection on external dependency doesn't work #2596

Closed
4 tasks done
iwarapter opened this issue Jan 6, 2020 · 5 comments
Closed
4 tasks done

Bean introspection on external dependency doesn't work #2596

iwarapter opened this issue Jan 6, 2020 · 5 comments
Assignees
Labels
type: bug Something isn't working
Milestone

Comments

@iwarapter
Copy link

iwarapter commented Jan 6, 2020

Task List

  • Steps to reproduce provided
  • Stacktrace (if present) provided
  • Example that reproduces the problem uploaded to Github
  • Full description of the issue provided (see below)

Steps to Reproduce

  1. Define a class in an external dependency:
package com.example;

import javax.validation.constraints.NotBlank;

public class ExternalPerson {

  @NotBlank
  private String name;
  //getters etc
}

https://github.com/iwarapter/mn-bean-validation-error-demo/blob/master/swagger-models/src/main/java/com/example/ExternalPerson.java

  1. Create a class to introspect another class in a dependency:
package example.micronaut;

import com.example.ExternalPerson;
import io.micronaut.core.annotation.Introspected;

@Introspected(classes = {ExternalPerson.class})
public class ExternalPersonConfig {
}

https://github.com/iwarapter/mn-bean-validation-error-demo/blob/master/app/src/main/java/example/micronaut/ExternalPersonConfig.java

  1. Define a controller to validate the payload:
@Post("/externalperson")
  public String personValidation(@Body @Valid ExternalPerson p) {
    return p.getName();
  }
  1. Post invalid request and expect to get bad request response, but instead internal server error:
    https://github.com/iwarapter/mn-bean-validation-error-demo/blob/master/app/src/test/java/example/micronaut/HelloControllerTest.java#L56
io.micronaut.core.beans.exceptions.IntrospectionException: Error loading BeanIntrospection for type [class com.example.ExternalPerson]: tried to access class com.example.$ExternalPerson$Introspection from class example.micronaut.$ExternalPersonConfig$IntrospectionRef0
	at io.micronaut.core.beans.DefaultBeanIntrospector.findIntrospection(DefaultBeanIntrospector.java:81)
	at io.micronaut.jackson.modules.BeanIntrospectionModule$BeanIntrospectionDeserializerModifier.updateBuilder(BeanIntrospectionModule.java:234)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:238)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:137)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:411)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
	at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
	at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477)
	at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4191)
	at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3980)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2277)
	at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:2759)
	at io.micronaut.jackson.convert.JsonNodeToObjectConverter.convert(JsonNodeToObjectConverter.java:64)
	at io.micronaut.jackson.convert.JsonNodeToObjectConverter.convert(JsonNodeToObjectConverter.java:37)
	at io.micronaut.core.convert.DefaultConversionService.convert(DefaultConversionService.java:114)
	at io.micronaut.context.env.DefaultEnvironment.convert(DefaultEnvironment.java:359)
	at io.micronaut.core.convert.ConversionService.convert(ConversionService.java:117)
	at io.micronaut.http.bind.binders.DefaultBodyAnnotationBinder.bind(DefaultBodyAnnotationBinder.java:78)
	at io.micronaut.http.bind.binders.DefaultBodyAnnotationBinder.bind(DefaultBodyAnnotationBinder.java:37)
	at io.micronaut.http.server.binding.RequestArgumentSatisfier.lambda$getValueForBlockingBodyArgumentBinder$3(RequestArgumentSatisfier.java:161)
	at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:253)
	at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:122)
	at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$17(RoutingInBoundHandler.java:1400)
	at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:71)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty.subscribeActual(FlowableSwitchIfEmpty.java:32)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14868)
	at io.micronaut.http.context.ServerRequestTracingPublisher.lambda$subscribe$0(ServerRequestTracingPublisher.java:52)
	at io.micronaut.http.context.ServerRequestContext.with(ServerRequestContext.java:52)
	at io.micronaut.http.context.ServerRequestTracingPublisher.subscribe(ServerRequestTracingPublisher.java:52)
	at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82)
	at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:288)
	at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:253)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalAccessError: tried to access class com.example.$ExternalPerson$Introspection from class example.micronaut.$ExternalPersonConfig$IntrospectionRef0
	at example.micronaut.$ExternalPersonConfig$IntrospectionRef0.load(Unknown Source)
	at io.micronaut.core.beans.DefaultBeanIntrospector.lambda$findIntrospection$0(DefaultBeanIntrospector.java:72)
	at java.util.Optional.map(Optional.java:215)
	at io.micronaut.core.beans.DefaultBeanIntrospector.findIntrospection(DefaultBeanIntrospector.java:68)
	... 55 common frames omitted

Expected Behaviour

Documented feature works as expected:
https://docs.micronaut.io/latest/guide/index.html#_use_the_code_introspected_code_annotation_on_a_configuration_class

Actual Behaviour

Caused by: java.lang.IllegalAccessError: tried to access class com.example.$ExternalPerson$Introspection from class example.micronaut.$ExternalPersonConfig$IntrospectionRef0

Environment Information

  • Operating System: mac
  • Micronaut Version: 1.2.8
  • JDK Version:
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Example Application

@ankit5174
Copy link

Is this issue fixed. Facing the same issue

@vtlkzmn
Copy link

vtlkzmn commented Apr 1, 2020

you are not alone with that issue=)

@jameskleeh
Copy link
Contributor

jameskleeh commented Apr 1, 2020 via email

@ankit5174
Copy link

@jameskleeh i can reproduce the issue in 1.3.3. Will open an issue

@ankit5174
Copy link

@jameskleeh it is not an issue. I had module micronaut project where all my pojo resides. If i place @introspected in the pojo class which is a dependency on my service project. Then the bean Introspection doesn't take place. Removed @introspected from the pojo. Works fine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type: bug Something isn't working
Projects
None yet
Development

No branches or pull requests

5 participants