java.lang.NoSuchMethodError

There are no available Samebug tips for this exception. Do you have an idea how to solve this issue? A short tip would help users who saw this issue last week.

  • {code} 18:59:42.985 | WARN | Thread-24 | o.s.b.f.s.DisposableBeanAdapter | ry.support.DisposableBeanAdapter 247 | Invocation of destroy method failed on bean with name 'siteTenantConfig.PersonRequestConfig': java.lang.NoSuchMethodError: com.quikdo.hub.app.SiteTenantConfig$PersonRequestConfig.destroy()V {code} call stack: {code} at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:247) at org.springframework.beans.factory.support.DisposableBeanAdapter.run(DisposableBeanAdapter.java:214) at org.springframework.web.context.request.AbstractRequestAttributes.executeRequestDestructionCallbacks(AbstractRequestAttributes.java:91) at org.springframework.web.context.request.AbstractRequestAttributes.requestCompleted(AbstractRequestAttributes.java:47) at org.soluvas.commons.shell.ExtCommandSupport.execute(ExtCommandSupport.java:62) at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35) at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477) at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403) {code} It results from the following @Configuration : {code} @Configuration @Scope(value="request") @Import(TenantDataConfig.class) public class SiteTenantConfig { @Inject @DataFolder private String dataFolder; @Inject private TenantRef tenant; @Inject private Environment env; @Bean @Scope("request") public PermalinkCatalog permalinkCatalog() { return new StaticXmiLoader<PermalinkCatalog>(SitePackage.eINSTANCE, dataFolder + "/common/custom.PermalinkCatalog.xmi").get(); } @Bean @Scope("request") public PermalinkManager permalinkMgr() { return new PermalinkManagerImpl(permalinkCatalog()); } @Bean(name="cDbCon") @Scope("request") @Deprecated public CouchDbConnector cDbCon() throws MalformedURLException { final HttpClient httpClient = new StdHttpClient.Builder() .url(env.getRequiredProperty("couchDbUrl")) .username(env.getRequiredProperty("couchDbUsername")) .password(env.getRequiredProperty("couchDbPassword")) .build(); final String dbNameCouchDb = tenant.getTenantId() + "_" + tenant.getTenantEnv(); final StdCouchDbInstance stdCouchDbInstance = new StdCouchDbInstance(httpClient); final StdCouchDbConnector cDbCon = new StdCouchDbConnector(dbNameCouchDb, stdCouchDbInstance); cDbCon.createDatabaseIfNotExists(); return cDbCon; } @Bean @Scope("request") public DelegatingSupplier<SecurityCatalog> securityCatalogSupplier() { return new AggregatingSupplier<SecurityCatalog>(SecurityFactory.eINSTANCE, SecurityPackage.Literals.SECURITY_CATALOG, ImmutableList.<Supplier<SecurityCatalog>>of()); } @Bean @Scope("request") public SupplierXmiClasspathScanner<SecurityCatalog> securitySecurityCatalogScanner() { return new SupplierXmiClasspathScanner<>(SecurityPackage.eINSTANCE, SecurityCatalog.class, securityCatalogSupplier(), SecurityPackage.class); } @Bean @Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS) public Realm shiroRealm() throws MalformedURLException { return new SoluvasCouchDbRealm(securityCatalogSupplier(), cDbCon()); } @Configuration @Lazy public static class PersonConfig { private static final Logger log = LoggerFactory .getLogger(SiteTenantConfig.PersonConfig.class); private Map<String, CouchDbPersonRepository> personRepoMap; @Inject private Environment env; @Inject private ClientConnectionManager connMgr; @Resource(name="sysConfigMap") private Map<String, QuikdoSysConfig> sysConfigMap; @PostConstruct public void init() { log.info("Initializing {} CouchDB Person repositories: {}", sysConfigMap.size(), Iterables.limit(sysConfigMap.keySet(), 10)); final ImmutableMap.Builder<String, CouchDbPersonRepository> builder = ImmutableMap.builder(); final String tenantEnv = env.getRequiredProperty("tenantEnv"); for (QuikdoSysConfig sysConfig : sysConfigMap.values()) { final CouchDbPersonRepository personRepo = new CouchDbPersonRepository(connMgr, sysConfig.getCouchDbUri(), sysConfig.getTenantId() + "_" + tenantEnv); builder.put(sysConfig.getTenantId(), personRepo); } personRepoMap = builder.build(); } @PreDestroy public void destroy() { log.info("Shutting down {} CouchDB Person repositories: {}", personRepoMap.size(), Iterables.limit(personRepoMap.keySet(), 10)); for (CouchDbPersonRepository personRepo : personRepoMap.values()) { personRepo.destroy(); } } @Bean public Map<String, CouchDbPersonRepository> personRepoMap() { return personRepoMap; } } @Configuration @Lazy @Scope("request") public static class PersonRequestConfig { @Inject private TenantRef tenant; @Resource(name="personRepoMap") private Map<String, PersonRepository> personRepoMap; @Bean(name={"personRepo", "personLookup"}) @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) public PersonRepository personRepo() { return personRepoMap.get(tenant.getTenantId()); } } } {code} PersonRequestConfig is @Configuration @Lazy @Scope("request") that has no destroy method. So even if Spring tries to call one (which it shouldn't in the first place), the log should be DEBUG. And how did it determine the "destroy()" method name?
    via by Hendy Irawan,
  • {code} 18:59:42.985 | WARN | Thread-24 | o.s.b.f.s.DisposableBeanAdapter | ry.support.DisposableBeanAdapter 247 | Invocation of destroy method failed on bean with name 'siteTenantConfig.PersonRequestConfig': java.lang.NoSuchMethodError: com.quikdo.hub.app.SiteTenantConfig$PersonRequestConfig.destroy()V {code} call stack: {code} at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:247) at org.springframework.beans.factory.support.DisposableBeanAdapter.run(DisposableBeanAdapter.java:214) at org.springframework.web.context.request.AbstractRequestAttributes.executeRequestDestructionCallbacks(AbstractRequestAttributes.java:91) at org.springframework.web.context.request.AbstractRequestAttributes.requestCompleted(AbstractRequestAttributes.java:47) at org.soluvas.commons.shell.ExtCommandSupport.execute(ExtCommandSupport.java:62) at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35) at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477) at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403) {code} It results from the following @Configuration : {code} @Configuration @Scope(value="request") @Import(TenantDataConfig.class) public class SiteTenantConfig { @Inject @DataFolder private String dataFolder; @Inject private TenantRef tenant; @Inject private Environment env; @Bean @Scope("request") public PermalinkCatalog permalinkCatalog() { return new StaticXmiLoader<PermalinkCatalog>(SitePackage.eINSTANCE, dataFolder + "/common/custom.PermalinkCatalog.xmi").get(); } @Bean @Scope("request") public PermalinkManager permalinkMgr() { return new PermalinkManagerImpl(permalinkCatalog()); } @Bean(name="cDbCon") @Scope("request") @Deprecated public CouchDbConnector cDbCon() throws MalformedURLException { final HttpClient httpClient = new StdHttpClient.Builder() .url(env.getRequiredProperty("couchDbUrl")) .username(env.getRequiredProperty("couchDbUsername")) .password(env.getRequiredProperty("couchDbPassword")) .build(); final String dbNameCouchDb = tenant.getTenantId() + "_" + tenant.getTenantEnv(); final StdCouchDbInstance stdCouchDbInstance = new StdCouchDbInstance(httpClient); final StdCouchDbConnector cDbCon = new StdCouchDbConnector(dbNameCouchDb, stdCouchDbInstance); cDbCon.createDatabaseIfNotExists(); return cDbCon; } @Bean @Scope("request") public DelegatingSupplier<SecurityCatalog> securityCatalogSupplier() { return new AggregatingSupplier<SecurityCatalog>(SecurityFactory.eINSTANCE, SecurityPackage.Literals.SECURITY_CATALOG, ImmutableList.<Supplier<SecurityCatalog>>of()); } @Bean @Scope("request") public SupplierXmiClasspathScanner<SecurityCatalog> securitySecurityCatalogScanner() { return new SupplierXmiClasspathScanner<>(SecurityPackage.eINSTANCE, SecurityCatalog.class, securityCatalogSupplier(), SecurityPackage.class); } @Bean @Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS) public Realm shiroRealm() throws MalformedURLException { return new SoluvasCouchDbRealm(securityCatalogSupplier(), cDbCon()); } @Configuration @Lazy public static class PersonConfig { private static final Logger log = LoggerFactory .getLogger(SiteTenantConfig.PersonConfig.class); private Map<String, CouchDbPersonRepository> personRepoMap; @Inject private Environment env; @Inject private ClientConnectionManager connMgr; @Resource(name="sysConfigMap") private Map<String, QuikdoSysConfig> sysConfigMap; @PostConstruct public void init() { log.info("Initializing {} CouchDB Person repositories: {}", sysConfigMap.size(), Iterables.limit(sysConfigMap.keySet(), 10)); final ImmutableMap.Builder<String, CouchDbPersonRepository> builder = ImmutableMap.builder(); final String tenantEnv = env.getRequiredProperty("tenantEnv"); for (QuikdoSysConfig sysConfig : sysConfigMap.values()) { final CouchDbPersonRepository personRepo = new CouchDbPersonRepository(connMgr, sysConfig.getCouchDbUri(), sysConfig.getTenantId() + "_" + tenantEnv); builder.put(sysConfig.getTenantId(), personRepo); } personRepoMap = builder.build(); } @PreDestroy public void destroy() { log.info("Shutting down {} CouchDB Person repositories: {}", personRepoMap.size(), Iterables.limit(personRepoMap.keySet(), 10)); for (CouchDbPersonRepository personRepo : personRepoMap.values()) { personRepo.destroy(); } } @Bean public Map<String, CouchDbPersonRepository> personRepoMap() { return personRepoMap; } } @Configuration @Lazy @Scope("request") public static class PersonRequestConfig { @Inject private TenantRef tenant; @Resource(name="personRepoMap") private Map<String, PersonRepository> personRepoMap; @Bean(name={"personRepo", "personLookup"}) @Scope(value="request", proxyMode=ScopedProxyMode.INTERFACES) public PersonRepository personRepo() { return personRepoMap.get(tenant.getTenantId()); } } } {code} PersonRequestConfig is @Configuration @Lazy @Scope("request") that has no destroy method. So even if Spring tries to call one (which it shouldn't in the first place), the log should be DEBUG. And how did it determine the "destroy()" method name?
    via by Hendy Irawan,
    • java.lang.NoSuchMethodError: com.quikdo.hub.app.SiteTenantConfig$PersonRequestConfig.destroy()V {code} call stack: {code} at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:247) at org.springframework.beans.factory.support.DisposableBeanAdapter.run(DisposableBeanAdapter.java:214) at org.springframework.web.context.request.AbstractRequestAttributes.executeRequestDestructionCallbacks(AbstractRequestAttributes.java:91) at org.springframework.web.context.request.AbstractRequestAttributes.requestCompleted(AbstractRequestAttributes.java:47) at org.soluvas.commons.shell.ExtCommandSupport.execute(ExtCommandSupport.java:62) at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:35) at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477) at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
    No Bugmate found.