carbon-governance icon indicating copy to clipboard operation
carbon-governance copied to clipboard

user defined library: NoClassDefFoundError when using GovernanceUtils

Open zar3bski opened this issue 4 years ago • 0 comments

Description: I am trying to enrich this handler (which protects APIs with Basic Authentication) with the ability to read credentials from the governance registry. I thus used retrieveGovernanceArtifactByPath from GovernanceUtils.

import org.wso2.carbon.governance.api.common.dataobjects.GovernanceArtifact;
import org.wso2.carbon.governance.api.util.GovernanceUtils;
import org.wso2.carbon.registry.core.Registry;
import org.wso2.carbon.registry.core.config.RegistryContext;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
.....
    public boolean processSecurity(String credentials) {
        String decodedCredentials = new String(new Base64().decode(credentials.getBytes()));
        String userName = decodedCredentials.split(":")[0];
        String password = decodedCredentials.split(":")[1];
        /*here: */
        try {
            Registry reg = RegistryContext.getBaseInstance().getEmbeddedRegistryService().getConfigSystemRegistry();
            GovernanceArtifact userNameFromReg = GovernanceUtils.retrieveGovernanceArtifactByPath(reg, "/_system/governance/users/ei_user");
            GovernanceArtifact userPassFromReg = GovernanceUtils.retrieveGovernanceArtifactByPath(reg, "/_system/governance/users/ei_password");

            if (userNameFromReg.getAttribute(".").equals(userName) && userPassFromReg.getAttribute(".").equals(password)) {
                return true;
            } else {
                return false;
            }

        } catch (RegistryException e) {
            e.printStackTrace();
            return false;
        }
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>some_company</groupId>
    <artifactId>REST-BasicAuth-Handler</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>REST-basic-auth-handler</name>
    <url>http://maven.apache.org</url>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.synapse</groupId>
            <artifactId>synapse-core</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.synapse</groupId>
            <artifactId>synapse-extensions</artifactId>
            <version>3.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon.governance</groupId>
            <artifactId>org.wso2.carbon.governance.api</artifactId>
            <version>4.8.19</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.carbon</groupId>
            <artifactId>org.wso2.carbon.registry.core</artifactId>
            <version>4.4.26</version>
        </dependency>
    </dependencies>
</project>

Compilation works OK, the .jar is loaded from $EI_HOME/lib but I get the following error:

[2020-10-19 15:56:49,592] [] ERROR - NativeWorkerPool Uncaught exception
java.lang.NoClassDefFoundError: org/wso2/carbon/governance/api/util/GovernanceUtils
        at org.vicat.rest.BasicAuthHandler.processSecurity(BasicAuthHandler.java:78)
        at org.vicat.rest.BasicAuthHandler.handleRequest(BasicAuthHandler.java:49)
        at org.apache.synapse.rest.API.process(API.java:357)
        at org.apache.synapse.rest.RESTRequestHandler.apiProcess(RESTRequestHandler.java:135)
        at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:113)
        at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:71)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:325)
        at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:92)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
        at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:338)
        at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:159)
        at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
        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.ClassNotFoundException: org.wso2.carbon.governance.api.util.GovernanceUtils cannot be found by REST_BasicAuth_Handler_1.0_SNAPSHOT_1.0.0
        at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
        at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
        at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

I also tried with to package all dependencies in a fat jar using maven-assembly-plugin, made sure that GovernanceUtils was present in the .jar: still the very same error.

Suggested Labels: udf,registry,library

Affected Product Version: WSO2-EI 6.5.0

zar3bski avatar Oct 19 '20 14:10 zar3bski