#java #vert.x #quarkus
Вопрос:
У меня есть поле поиска класса перечисления{имя, версия} и класс запроса
private Maplt;SearchableField,Objectgt; query; private Maplt;SearchableField, Longgt; field; private Maplt;SearchableField,Longgt; sort;
Я хочу заставить тело API выполнять поиск только по полям (имя, версия). Проблема, которую я обнаружил, иногда это работает нормально, я получил желаемый результат, а иногда, не внося никаких изменений в свой код, перезапуская только приложение, внезапно оно больше не работает, и я получил эту ошибку. после перезапуска приложения без внесения каких-либо изменений ни в мой код, ни в JSON тела, он хорошо работает без ошибок.
Я попытался преобразовать карту lt;перечисление, объектgt; в картуlt;перечисление, объектgt;lt;Строка, объектgt;, но получил то же поведение
Maplt;String,Objectgt; query = doc.getQuery().entrySet().stream() .collect(Collectors.toMap(e -gt; e.getKey().name(), Map.Entry::getValue));
Так как же мне избежать этой проблемы, пожалуйста?
"stack": "java.lang.ClassCastException: class java.lang.String cannot be cast to class com.example.SearchableField (java.lang.String is in module java.base of loader 'bootstrap'; com.example.SearchableField is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @38a1c423)rntat com.example.model.Service.lambda$streamAllServices$0(Service.java:32) rntat java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:177) rntat java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) rntat java.base/java.util.HashMap$EntrySpliterator.forEachRemaining(HashMap.java:1746) rntat java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) rntat java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) rntat java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) rntat java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) rntat java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) rntat com.example.model.Service.streamAllServices(Service.java:32) rntat com.example.rest.ServiceQueryCommand.getAllServices(ServiceQueryCommand.java:33) rntat com.example.rest.ServiceQueryCommand_Subclass.getAllServices$superforward1(ServiceQueryCommand_Subclass.zig:126) rntat com.example.rest.ServiceQueryCommand_Subclass$function$1.apply(ServiceQueryCommand_Subclass$function$1.zig:33) rntat io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:54) rntat io.quarkus.arc.runtime.devconsole.InvocationInterceptor.proceed(InvocationInterceptor.java:62) rntat io.quarkus.arc.runtime.devconsole.InvocationInterceptor.monitor(InvocationInterceptor.java:49) rntat io.quarkus.arc.runtime.devconsole.InvocationInterceptor_Bean.intercept(InvocationInterceptor_Bean.zig:516) rntat io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:41) rntat io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:41) rntat io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:32) rntat com.example.rest.ServiceQueryCommand_Subclass.getAllServices(ServiceQueryCommand_Subclass.zig:207) rntat com.example.rest.ServiceQueryCommand$quarkusrestinvoker$getAllServices_1c4b93897207492bfe00d441fe9872b666e1a566.invoke (ServiceQueryCommand$quarkusrestinvoker$getAllServices_1c4b93897207492bfe00d441fe9872b666e1a566.zig:39) rntat org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29) rntat org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:7) rntat org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:141) rntat org.jboss.resteasy.reactive.server.vertx.VertxResteasyReactiveRequestContext$1$1.handle(VertxResteasyReactiveRequestContext.java:72) rntat org.jboss.resteasy.reactive.server.vertx.VertxResteasyReactiveRequestContext$1$1.handle(VertxResteasyReactiveRequestContext.java:69) rntat io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100) rntat io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:63) rntat io.vertx.core.impl.EventLoopContext.lambda$runOnContext$0(EventLoopContext.java:38) rntat io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) rntat io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469) rntat io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) rntat io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) rntat io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) rntat io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) rntat java.base/java.lang.Thread.run(Thread.java:829)"
Ответ №1:
Хотя структура/данные класса запроса не указаны, я предлагаю изменить перечисление, чтобы оно имело строковую версию/поле. Что-то вроде
enum SearchableField{ name("NAME"), version("VERSION"); private final String fieldName ; SearchableField(final String fieldName){ this.fieldName = fieldName; } public String getFieldName(){ return this.fieldName; } }
Таким образом, у вас будет хорошо предсказуемая строковая версия нужного вам значения перечисления. Имя можно получить с помощью метода GetFieldName ().
Комментарии:
1. спасибо за ваш ответ, я уже тестировал так, но у меня всегда было одно и то же поведение
2. Не могли бы вы добавить содержимое запроса? Или что возвращает doc.getQuery ()?
3. документ выглядит примерно так { «запрос»: { «версия»: { «$gte» : 0, «$lte» : 2 } }, «поле»: { «ключ» : 1, «версия»:1 }, «сортировка»: { «версия»:1 }, «смещение»:0, «ограничение»:2, «язык» : «fr» }