Не ответ, но добавление: я получил, потому что запустил groovysh
(Groovy 2.4.13), если JAVA_HOME указывает на установку Java 9 (точнее, java version "9.0.1"
):
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
...
..
.
..
...
at org.codehaus.groovy.tools.shell.Groovysh.(Groovysh.groovy:135)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.codehaus.groovy.tools.shell.Main.(Main.groovy:66)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
... 6 more
Решение было:
jaxb-ri-2.3.0.zip
/usr/local/java/jaxb-ri/
). Другое решение может существовать (возможно, через SDKMAN, я dunno) CLASSPATH
. Я делаю это через скрипт, запущенный при запуске bash, называемый /etc/profile.d/java.sh
, где я добавил (среди многих других строк) следующий цикл: Упакован в функцию ...
function extend_qzminynshg {
local BASE="/usr/local/java"
for LIB in jaxb-api.jar jaxb-core.jar jaxb-impl.jar jaxb-jxc.jar jaxb-xjc.jar; do
local FQLIB="$BASE/jaxb-ri/lib/$LIB"
if [[ -f $FQLIB ]]; then
export CLASSPATH=$FQLIB:$CLASSPATH
fi
done
}
extend_qzminynshg; unset extend_qzminynshg
И это работает!
Ваша функция обновления будет выглядеть так
updateItem(id, itemAttributes) {
var index = this.state.items.findIndex(x=> x.id === id);
if (index === -1)
// handle error
else
this.setState({
items: [
...this.state.items.slice(0,index),
Object.assign({}, this.state.items[index], itemAttributes),
...this.state.items.slice(index+1)
]
});
}
И вы используете ее так
this.updateItem(2, {someattr: 'a new value'});
Gross right?
Но у вас будет большая головная боль вообще, если вы продолжите строить сложное приложение таким образом. Вы действительно должны изучить redux или другую реализацию Flux, которая лучше подходит для решения этих проблем.
Redux использует концепцию редукторов состояния, каждая из которых работает на определенном фрагменте состояние вашей заявки. Таким образом, вам не нужно вручную копать все ваше состояние каждый раз, когда вы хотите повлиять на глубокие изменения.
Создатель Redux, Дэн Абрамов, сделал два видеокурса онлайн бесплатно. Дэн - отличный учитель, и я чувствовал себя комфортно с рисунком Редукса, проведя всего один день с ним.