Skip to content

Cannot invoke "com.fasterxml.jackson.databind.node.ObjectNode.withArra #8

@robert-sanfeliu

Description

@robert-sanfeliu

A simple syncRequest like the code provided below fails with:

[INFO ] 2025-07-15 17:34:09.159 [pool-2-thread-3] Manager - Linking consumer topic://eu.nebulouscloud.cfsb.get_node_candidates_multi.reply
java.lang.NullPointerException: Cannot invoke "com.fasterxml.jackson.databind.node.ObjectNode.withArray(String, com.fasterxml.jackson.databind.JsonNode$OverwriteMode, boolean)" because "jsonBody" is null
	at eut.nebulouscloud.tests.internal.TestSyncRequest.<init>(TestSyncRequest.java:70)
	at eut.nebulouscloud.tests.internal.TestSyncRequest.main(TestSyncRequest.java:92)
[WARN ] 2025-07-15 17:34:15.512 [pool-2-thread-3] Manager - Seems the consumer has been stopped 

This only happens with the "new" version of the Java exn library, dependency:

<groupId>io.github.eu-nebulous</groupId>
<artifactId>exn-connector-java</artifactId>
<version>1.0-SNAPSHOT</version>

Old version of the dependency works fine:

<groupId>eu.nebulouscloud</groupId>
<artifactId>exn-connector-java</artifactId>
<version>1.0-SNAPSHOT</version>

Sample code:

package eut.nebulouscloud.tests.internal;

import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

import eu.nebulouscloud.exn.Connector;
import eu.nebulouscloud.exn.core.Context;
import eu.nebulouscloud.exn.core.SyncedPublisher;
import eu.nebulouscloud.exn.handlers.ConnectorHandler;
import eu.nebulouscloud.exn.settings.StaticExnConfig;

public class TestSyncRequest {

    static Logger LOGGER = LoggerFactory.getLogger(TestSyncRequest.class);
    protected ObjectMapper om = new ObjectMapper();
    private Connector myEXNClient;
    static Context context;
    String applicationId = UUID.randomUUID().toString();

    private TestSyncRequest() throws InterruptedException {
        myEXNClient = new Connector(
            "thisINotImportant",
            new ConnectorHandler() {
                public void onReady(Context context) {
                    TestSyncRequest.context = context;
                    LOGGER.info("Optimiser-controller connected to ActiveMQ, got connection context {}", context);
                }
            },
            List.of(),
            List.of(),
            true,
            true,
            new StaticExnConfig("localhost", 5672, "admin", "nebulous", 15, "eu.nebulouscloud")
        );
        myEXNClient.start();

        LOGGER.info("Starting test");
        String queryBody = "[[{\"type\":\"AttributeRequirement\",\"requirementClass\":\"hardware\",\"requirementAttribute\":\"ram\",\"requirementOperator\":\"GEQ\",\"value\":\"8192\"},{\"type\":\"AttributeRequirement\",\"requirementClass\":\"hardware\",\"requirementAttribute\":\"cores\",\"requirementOperator\":\"GEQ\",\"value\":\"4\"},{\"type\":\"NodeTypeRequirement\",\"nodeTypes\":[\"IAAS\"],\"jobIdForBYON\":\"\",\"jobIdForEDGE\":\"\"},{\"type\":\"AttributeRequirement\",\"requirementClass\":\"cloud\",\"requirementAttribute\":\"id\",\"requirementOperator\":\"EQ\",\"value\":\"669b7f95-08cb-4f6a-a830-2b7ab366194f\"}]]";
        String appID = UUID.randomUUID().toString();
        ObjectMapper mapper = new ObjectMapper();
        int publisherNameCounter = 0;
        while (true) {
            SyncedPublisher findBrokerNodeCandidatesMultiple = null;
            try {
                findBrokerNodeCandidatesMultiple = new SyncedPublisher(
                    "findBrokerNodeCandidatesMultiple" + publisherNameCounter++,
                    "eu.nebulouscloud.cfsb.get_node_candidates_multi",
                    true,
                    true
                );
                Context context = TestSyncRequest.context;
                context.registerPublisher(findBrokerNodeCandidatesMultiple);
                Map<String, Object> msg = Map.of("body", queryBody);    
                Map<String, Object> response = findBrokerNodeCandidatesMultiple.sendSync(msg, appID, null, false);
                ObjectNode jsonBody = mapper.convertValue(response, ObjectNode.class);

                List<JsonNode> result = Arrays.asList(
                    mapper.convertValue(
                        jsonBody.withArray("/body", JsonNode.OverwriteMode.ALL, true),
                        JsonNode[].class
                    )
                );
                LOGGER.info(appID + "->" + result.size());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (findBrokerNodeCandidatesMultiple != null) {
                    context.unregisterPublisher(findBrokerNodeCandidatesMultiple.key());
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        new TestSyncRequest();
    }
}

```

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions