Skip to content

Commit 65db975

Browse files
fix: return empty Text component if renderer is updated with null (#8168) (#8173)
Add the same behavior as when `createComponenet` is called and the component renderer returns `null` to the `updateComponent` method. That prevents a NPE in the `AbstractComponentDataGenerator#refreshData` method when it tries to call `getElement` in the updated component. Fixes #6825 Co-authored-by: Diego Cardoso <diego@vaadin.com>
1 parent e72b5e8 commit 65db975

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

vaadin-messages-flow-parent/vaadin-messages-flow/src/test/java/com/vaadin/flow/component/messages/tests/MessageListTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,21 @@ public class MessageListTest {
4242
private MessageList messageList;
4343
private MessageListItem item1;
4444
private MessageListItem item2;
45+
private UI ui;
4546

4647
@Before
4748
public void setup() {
4849
messageList = new MessageList();
4950
item1 = new MessageListItem();
51+
ui = new UI();
52+
UI.setCurrent(ui);
5053
item2 = new MessageListItem();
5154
}
5255

5356
@After
5457
public void tearDown() {
5558
UI.setCurrent(null);
59+
ui = null;
5660
}
5761

5862
@Test(expected = UnsupportedOperationException.class)
@@ -96,7 +100,6 @@ public void setItems_containsNullItem_throws() {
96100

97101
@Test
98102
public void setImageAsStreamResource_overridesImageUrl() {
99-
UI.setCurrent(new UI());
100103
item1.setUserImage("foo/bar");
101104
item1.setUserImageResource(new StreamResource("message-list-img",
102105
() -> getClass().getResourceAsStream("baz/qux")));
@@ -106,7 +109,6 @@ public void setImageAsStreamResource_overridesImageUrl() {
106109

107110
@Test
108111
public void setImageAsUrl_streamResourceBecomesNull() {
109-
UI.setCurrent(new UI());
110112
item1.setUserImageResource(new StreamResource("message-list-img",
111113
() -> getClass().getResourceAsStream("baz/qux")));
112114
item1.setUserImage("foo/bar");
@@ -115,7 +117,6 @@ public void setImageAsUrl_streamResourceBecomesNull() {
115117

116118
@Test
117119
public void setImageHandler_overridesImageUrl() {
118-
UI.setCurrent(new UI());
119120
item1.setUserImage("foo/bar");
120121
item1.setUserImageHandler(
121122
DownloadHandler.fromInputStream(data -> new DownloadResponse(
@@ -127,7 +128,6 @@ public void setImageHandler_overridesImageUrl() {
127128

128129
@Test
129130
public void setImageHandler_streamResourceBecomesNull() {
130-
UI.setCurrent(new UI());
131131
item1.setUserImageHandler(
132132
DownloadHandler.fromInputStream(data -> new DownloadResponse(
133133
getClass().getResourceAsStream("baz/qux"),

vaadin-renderer-flow-parent/vaadin-renderer-flow/src/main/java/com/vaadin/flow/data/renderer/ComponentDataGenerator.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,20 @@ public void generateData(T item, JsonObject jsonObject) {
101101

102102
@Override
103103
protected Component createComponent(T item) {
104-
Component c = componentRenderer.createComponent(item);
105-
if (c == null) {
106-
c = new Text("");
107-
}
108-
return c;
104+
return ensureNonNullComponent(componentRenderer.createComponent(item));
109105
}
110106

111107
@Override
112108
protected Component updateComponent(Component currentComponent, T item) {
113-
return componentRenderer.updateComponent(currentComponent, item);
109+
return ensureNonNullComponent(
110+
componentRenderer.updateComponent(currentComponent, item));
111+
}
112+
113+
private Component ensureNonNullComponent(Component component) {
114+
if (component == null) {
115+
return new Text("");
116+
}
117+
return component;
114118
}
115119

116120
@Override

vaadin-renderer-flow-parent/vaadin-renderer-flow/src/test/java/com/vaadin/flow/data/renderer/ComponentRendererTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,11 @@ public void nullValues() {
148148
Assert.assertNotNull(
149149
"Placeholder component should be generated for null values", c);
150150
Assert.assertEquals(0, c.getElement().getChildCount());
151+
152+
c = cdg.updateComponent(c, "foo");
153+
Assert.assertNotNull(
154+
"Placeholder component should be generated for null values", c);
155+
Assert.assertEquals(0, c.getElement().getChildCount());
151156
}
152157

153158
private void attachElement(UI ui, Element contentTemplate) {

0 commit comments

Comments
 (0)