У меня есть примеры строк:
Data Management_Commercial IMS (система управления информацией)
Data Management_Non-структурированное управление данными (текстовые документы, бумажные формы и т.д.)
Я передаю строки со страницы jsp через input-move-boxes
. Поэтому на странице jsp у меня есть:
List<KeyValuePair> leftDataManagementList = new ArrayList<KeyValuePair>();
List<KeyValuePair> rightDataManagementList = new ArrayList<KeyValuePair>();
rightDataManagementList.add(new KeyValuePair(attribute.getAttributeListName()+"_"+attribute.getAttributeListValue(), attribute.getAttributeListValue()));
leftDataManagementList.add(new KeyValuePair(attributeMaster.getAttributeListName()+"_"+attributeMaster.getAttributeListValue(), attributeMaster.getAttributeListValue()));
Поле input-move-box
в этом случае
<liferay-ui:input-move-boxes
leftBoxName="availabledm"
leftTitle="Data Management Available"
leftList="<%=leftDataManagementList %>"
rightBoxName="selecteddm"
rightTitle="Data Management Selected"
rightList="<%= rightDataManagementList%>"
/>
В классе java они извлекаются в переменной String[] selecteddm
.
String[] selecteddm = ParamUtil.getParameterValues(request, "selecteddm");
Но я пропускаю одну строку за раз. Поэтому, когда я храню первую строку Data Management_Commercial IMS (Information Management System)
в переменной. Я получаю ожидаемые результаты.
System.out.println("Length:" +selecteddm.length);//Length:1
System.out.println(Arrays.toString(selecteddm));//[Data Management_Commercial IMS (Information Management System)]
int count = 0;
for(String str:selecteddm){
System.out.println(str);//Data Management_Commercial IMS (Information Management System)
System.out.println(count++);//0
}
Теперь я получаю проблему со второй строкой Data Management_Non-structured Data Management (Text Documents, Paper Forms, etc.)
, Поскольку она разделяется на отдельные строки после запятой. В этом случае,
System.out.println("Length:" +selecteddm.length);//Length:3
//This print seems fine
System.out.println(Arrays.toString(selecteddm));//[Data Management_Non-structured Data Management (Text Documents, Paper Forms, etc.)]
int count = 0;
for(String str:selecteddm){
System.out.println(str);
System.out.println(count++);
}
Цикл в этом случае печатает:
Data Management_Non-structured Data Management (Text Documents
0
Paper Forms
1
etc.)
2
Почему это происходит именно так? В результате str.split("_")[1]
в строке во втором случае генерирует ArrayIndexOutOfBoundsException
. Как я могу избежать этого и заставить его работать как строка в первом случае?
Это связано с этой ошибкой? https://issues.liferay.com/browse/LPS-42949
EDIT: после чтения обновления, раскрывающего использование Liferay
Корень проблемы состоит в том, что вы передаете ярлыки отображения из формы вместо ключа для их идентификации. Вместо этого вы должны передать выбор формы по ключу, например:
List<User> userList = ...
List leftList = new ArrayList();
List rightList = new ArrayList();
for (int k = 0; k < userList.size(); k++) {
User user = (User) userList.get(k);
leftList.add(new KeyValuePair(String.valueOf(user.getUserId()), user.getScreenName()));
}
Второй аргумент KeyValuePair отображается пользователю, первый аргумент - это ключ, который отправляется как часть одного параметра запроса с запятой (содержащий все ключи выбранных элементов). Вы должны определить выбор, основанный на ключах, а не на ярлыках дисплея.
ParamUtil.getParameterValues в конечном счете разделяет значение на ",". Это объясняет поведение, которое вы видите.
Кстати: эта ошибка LPS-42949 кажется исправленной в последней версии Liferay. В любом случае это не является причиной ваших проблем.
rightDataManagementList.add(new KeyValuePair(attribute.getAttributeListName()+"_"+attribute.getAttributeListValue(), attribute.getAttributeListValue()));
значение к ключу rightDataManagementList.add(new KeyValuePair(attribute.getAttributeListName()+"_"+attribute.getAttributeListValue(), attribute.getAttributeListValue()));
, liferay.com/community/forums/-/message_boards/message/...