diff --git a/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/pom.xml b/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/pom.xml
index ef6391ffd7e..90dc47e6c86 100644
--- a/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/pom.xml
+++ b/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/pom.xml
@@ -71,6 +71,27 @@
7.0
provided
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+
+ org.assertj
+ assertj-core
+ 3.9.1
+ test
+
+
+
+
+ org.glassfish
+ jakarta.json
+ test
+
diff --git a/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/main/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandler.java b/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/main/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandler.java
index 1d4f32192b2..ca33d954534 100644
--- a/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/main/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandler.java
+++ b/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/main/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandler.java
@@ -1,7 +1,7 @@
-/**
+/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
- * Copyright (c) [2016-2017] Payara Foundation and/or its affiliates. All rights reserved.
+ * Copyright (c) [2016-2019] Payara Foundation and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
@@ -101,6 +101,9 @@ public JsonValue getValueObject() throws JsonException {
try {
Object attribute = delegate
.getMBeanAttribute(mbeanname, attributename);
+ if (attribute == null) {
+ return JsonValue.NULL;
+ }
TypeProcessor> processor = ProcessorFactory.getTypeProcessor(attribute);
return processor.processObject(attribute);
diff --git a/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/test/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandlerTest.java b/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/test/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandlerTest.java
new file mode 100644
index 00000000000..246ef22c863
--- /dev/null
+++ b/appserver/payara-appserver-modules/rest-monitoring/rest-monitoring-war/src/test/java/fish/payara/monitoring/rest/app/handler/MBeanAttributeReadHandlerTest.java
@@ -0,0 +1,121 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright (c) [2019] Payara Foundation and/or its affiliates. All rights reserved.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common Development
+ * and Distribution License("CDDL") (collectively, the "License"). You
+ * may not use this file except in compliance with the License. You can
+ * obtain a copy of the License at
+ * https://github.com/payara/Payara/blob/master/LICENSE.txt
+ * See the License for the specific
+ * language governing permissions and limitations under the License.
+ *
+ * When distributing the software, include this License Header Notice in each
+ * file and include the License file at glassfish/legal/LICENSE.txt.
+ *
+ * GPL Classpath Exception:
+ * The Payara Foundation designates this particular file as subject to the "Classpath"
+ * exception as provided by the Payara Foundation in the GPL Version 2 section of the License
+ * file that accompanied this code.
+ *
+ * Modifications:
+ * If applicable, add the following below the License Header, with the fields
+ * enclosed by brackets [] replaced by your own identifying information:
+ * "Portions Copyright [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ * If you wish your version of this file to be governed by only the CDDL or
+ * only the GPL Version 2, indicate your decision by adding "[Contributor]
+ * elects to include this software in this distribution under the [CDDL or GPL
+ * Version 2] license." If you don't indicate a single choice of license, a
+ * recipient has the option to distribute your version of this file under
+ * either the CDDL, the GPL Version 2 or to extend the choice of license to
+ * its licensees as provided above. However, if you add GPL Version 2 code
+ * and therefore, elected the GPL Version 2 license, then the option applies
+ * only if the new code is made subject to such option by the copyright
+ * holder.
+ */
+package fish.payara.monitoring.rest.app.handler;
+
+import fish.payara.monitoring.rest.app.MBeanServerDelegate;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+
+import javax.json.JsonArray;
+import javax.json.JsonNumber;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+
+
+public class MBeanAttributeReadHandlerTest {
+
+ private static final String BEAN_NAME = "someName";
+ private static final String BEAN_ATTRIBUTE = "someAttribute";
+
+ @Mock
+ private MBeanServerDelegate delegateMock;
+
+ @Before
+ public void setup() {
+ delegateMock = Mockito.mock(MBeanServerDelegate.class);
+ }
+
+ @Test
+ public void getValueObject_String() throws Exception {
+ MBeanAttributeReadHandler handler = new MBeanAttributeReadHandler(delegateMock, BEAN_NAME, BEAN_ATTRIBUTE);
+ when(delegateMock.getMBeanAttribute(BEAN_NAME, BEAN_ATTRIBUTE)).thenReturn("Payara");
+
+ JsonValue value = handler.getValueObject();
+ assertThat(value.getValueType()).isEqualTo(JsonValue.ValueType.STRING);
+ assertThat(((JsonString) value).getString()).isEqualTo("Payara");
+ }
+
+ @Test
+ public void getValueObject_Long() throws Exception {
+ MBeanAttributeReadHandler handler = new MBeanAttributeReadHandler(delegateMock, BEAN_NAME, BEAN_ATTRIBUTE);
+ when(delegateMock.getMBeanAttribute(BEAN_NAME, BEAN_ATTRIBUTE)).thenReturn(123L);
+
+ JsonValue value = handler.getValueObject();
+ assertThat(value.getValueType()).isEqualTo(JsonValue.ValueType.NUMBER);
+ assertThat(((JsonNumber) value).longValue()).isEqualTo(123L);
+ }
+
+ @Test
+ public void getValueObject_Boolean() throws Exception {
+ MBeanAttributeReadHandler handler = new MBeanAttributeReadHandler(delegateMock, BEAN_NAME, BEAN_ATTRIBUTE);
+ when(delegateMock.getMBeanAttribute(BEAN_NAME, BEAN_ATTRIBUTE)).thenReturn(Boolean.TRUE);
+
+ JsonValue value = handler.getValueObject();
+ assertThat(value).isEqualTo(JsonValue.TRUE);
+
+ }
+
+ @Test
+ public void getValueObject_Array() throws Exception {
+ MBeanAttributeReadHandler handler = new MBeanAttributeReadHandler(delegateMock, BEAN_NAME, BEAN_ATTRIBUTE);
+ when(delegateMock.getMBeanAttribute(BEAN_NAME, BEAN_ATTRIBUTE)).thenReturn(new Integer[]{1,2,3});
+
+ JsonValue value = handler.getValueObject();
+ assertThat(value.getValueType()).isEqualTo(JsonValue.ValueType.ARRAY);
+ List data = ((JsonArray) value).getValuesAs(JsonNumber.class);
+ assertThat(data.stream().map(JsonNumber::intValue)).containsExactly(1, 2, 3);
+ }
+
+ @Test
+ public void getValueObject_null() throws Exception {
+ MBeanAttributeReadHandler handler = new MBeanAttributeReadHandler(delegateMock, BEAN_NAME, BEAN_ATTRIBUTE);
+ when(delegateMock.getMBeanAttribute(BEAN_NAME, BEAN_ATTRIBUTE)).thenReturn(null);
+
+ JsonValue value = handler.getValueObject();
+ System.out.println(value);
+ }
+}
\ No newline at end of file