-
Bug
-
Resolution: Unresolved
-
P3
-
jfx11, 8u152, 9, 10
ADDITIONAL SYSTEM INFORMATION :
Linux yushijinhun-laptop 4.15.0-21-generic #22-Ubuntu SMP Tue May 1 13:26:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.18.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
A DESCRIPTION OF THE PROBLEM :
ProxyBuilder doesn't take Read-Only List Properties into consideration, which causes only the first element is added to the list while others are stripped.
I wrote a more detailed description here: https://gist.github.com/yushijinhun/87abb48d605b1a519f714349da043837
The bug appears in 8u152 but does not appear in 8u151.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Create a java bean.
2. Add a parameterized constructor to the bean, the parameter is annotated by @NamedArg.
3. Add a read-only list property to the bean.
4. Load an FXML which declares the bean and adds more than one elements to its list property.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The list property contains more then one element.
ACTUAL -
The list property contains only one element.
---------- BEGIN SOURCE ----------
test/Test.java:
package test;
import java.io.IOException;
import javafx.beans.NamedArg;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
public class Test {
private ObservableList<String> listProp = FXCollections.observableArrayList();
public Test() {}
// The problem is solved after the constructor is commented
public Test(@NamedArg("stringProp") String stringProp) {}
//
public ObservableList<String> getListProp() {
return listProp;
}
public static void main(String[] args) throws IOException {
Test region = new FXMLLoader(Test.class.getResource("/test.fxml")).load();
System.out.println("listProp: " + region.listProp);
if (region.listProp.size() == 2) {
System.out.println("Problem did not appear");
} else {
System.out.println("Problem appeared");
}
}
}
test.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import test.Test?>
<?import java.lang.String?>
<Test xmlns:fx="http://javafx.com/fxml">
<listProp>
<String fx:value="elementA"/>
<String fx:value="elementB"/>
</listProp>
</Test>
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Do not use @NamedArg in the constructor. (do not do step 2)
FREQUENCY : always
Linux yushijinhun-laptop 4.15.0-21-generic #22-Ubuntu SMP Tue May 1 13:26:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.18.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
A DESCRIPTION OF THE PROBLEM :
ProxyBuilder doesn't take Read-Only List Properties into consideration, which causes only the first element is added to the list while others are stripped.
I wrote a more detailed description here: https://gist.github.com/yushijinhun/87abb48d605b1a519f714349da043837
The bug appears in 8u152 but does not appear in 8u151.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Create a java bean.
2. Add a parameterized constructor to the bean, the parameter is annotated by @NamedArg.
3. Add a read-only list property to the bean.
4. Load an FXML which declares the bean and adds more than one elements to its list property.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The list property contains more then one element.
ACTUAL -
The list property contains only one element.
---------- BEGIN SOURCE ----------
test/Test.java:
package test;
import java.io.IOException;
import javafx.beans.NamedArg;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
public class Test {
private ObservableList<String> listProp = FXCollections.observableArrayList();
public Test() {}
// The problem is solved after the constructor is commented
public Test(@NamedArg("stringProp") String stringProp) {}
//
public ObservableList<String> getListProp() {
return listProp;
}
public static void main(String[] args) throws IOException {
Test region = new FXMLLoader(Test.class.getResource("/test.fxml")).load();
System.out.println("listProp: " + region.listProp);
if (region.listProp.size() == 2) {
System.out.println("Problem did not appear");
} else {
System.out.println("Problem appeared");
}
}
}
test.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import test.Test?>
<?import java.lang.String?>
<Test xmlns:fx="http://javafx.com/fxml">
<listProp>
<String fx:value="elementA"/>
<String fx:value="elementB"/>
</listProp>
</Test>
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Do not use @NamedArg in the constructor. (do not do step 2)
FREQUENCY : always