当前位置: 首页 > 知识库问答 >
问题:

Optaplanner Quarkus反射问题

葛永丰
2023-03-14

我正在使用内置的

solverFactory = SolverFactory.createFromXmlResource("solverConfig.xml");

在编译到Quarkus本机应用程序之前,这一切都很好,现在我从Optaplanner枚举中得到了反射问题:

ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.lang.NoSuchFieldError: org.optaplanner.core.api.domain.common.DomainAccessType: REFLECTION
        at com.sun.xml.bind.v2.model.nav.ReflectionNavigator.getEnumConstants(ReflectionNavigator.java:25)
        at com.sun.xml.bind.v2.model.nav.ReflectionNavigator.getEnumConstants(ReflectionNavigator.java:34)
        at com.sun.xml.bind.v2.model.impl.EnumLeafInfoImpl.calcConstants(EnumLeafInfoImpl.java:117)
        at com.sun.xml.bind.v2.model.impl.EnumLeafInfoImpl.getConstants(EnumLeafInfoImpl.java:181)
        at com.sun.xml.bind.v2.model.impl.EnumLeafInfoImpl.link(EnumLeafInfoImpl.java:188)
        at com.sun.xml.bind.v2.model.impl.ModelBuilder.link(ModelBuilder.java:427)
        at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.link(RuntimeModelBuilder.java:103)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:439)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:273)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:109)
        at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1126)
        at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:135)
        at java.lang.reflect.Method.invoke(Method.java:566)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:275)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:264)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:403)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:691)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:632)
        at org.optaplanner.core.impl.io.jaxb.GenericJaxbIO.<init>(GenericJaxbIO.java:89)
        at org.optaplanner.core.impl.io.jaxb.GenericJaxbIO.<init>(GenericJaxbIO.java:81)
        at org.optaplanner.core.impl.io.jaxb.SolverConfigIO.<init>(SolverConfigIO.java:27)
        at org.optaplanner.core.config.solver.SolverConfig.createFromXmlReader(SolverConfig.java:207)
        at org.optaplanner.core.config.solver.SolverConfig.createFromXmlInputStream(SolverConfig.java:182)
        at org.optaplanner.core.config.solver.SolverConfig.createFromXmlResource(SolverConfig.java:122)
        at org.optaplanner.core.config.solver.SolverConfig.createFromXmlResource(SolverConfig.java:97)
        at org.optaplanner.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:55)

我可以通过在调用SolverFactory的类中添加@RegisterForReflection来解决这些问题。createFromXmlResource(“solverConfig.xml”),但感觉这些反射注册不应该是手动步骤。目前我在@RegisterForReflection(targets={EnvironmentMode.class,RandomType.class,DomainAccessType.class}),但我猜还有很多枚举要添加到这个列表中。。。真的应该这么复杂吗?我正在使用Quarkus Optaplanner依赖项

<dependency>
  <groupId>org.optaplanner</groupId>
  <artifactId>optaplanner-quarkus</artifactId>
</dependency>

共有1个答案

柴磊
2023-03-14

通过另一种方式,我能够解决这个问题。

在我的类中,以前称为solverFactory=solverFactory。createFromXmlResource(“solverConfig.xml”),我现在只注入工厂:

@Inject
SolverFactory<Schedule> solverFactory;

并将XML文件名改为application.properties:

quarkus.optaplanner.solver-config-xml=solverConfig.xml
 类似资料:
  • JDK11+spring批处理 有人知道那些警告是什么意思吗: 警告:发生了非法的反射访问操作警告:org.springframework.cglib.core.reflectutils$1(jar:file:/users/boru/downloads/spcljr/build/libs/spcljr-0.0.1-snapshot.jar!/boot-inf/lib/spring-core-5.0

  • 我正在使用反射来调用java.util.Stream.Stream上的方法,但由于实际实现(ReferencePipeline等)具有运行的实际代码,因此在调用时会收到非法的反射访问警告,如果没有该调用,它将无法工作。我想知道是否有一种方法可以自动将其委托给一个访问不非法的超级方法?也就是说,我想调用,其中是合法的,而不是或任何实现。 编辑这里是一些代码。是通过反射获得的流的具体实例。

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

  • 问题内容: 如何通过反射访问对象的继承保护字段? 问题答案: 您可能会遇到两个问题-字段可能无法正常访问(私有),并且不在您正在查看的类中,而是位于层次结构中的某个位置。 这样的事情甚至可以解决这些问题:

  • 在Java9中有很多关于非法反射访问的问题。 我发现了很多关于如何处理错误消息的讨论,但我想知道非法反射访问实际上是什么。 所以我的问题是: 我认为这与Java9中引入的封装原则有关,但我找不到一个解释,说明它们是如何联系在一起的,是什么触发了警告,以及在什么场景中。