Странное поведение при преобразовании перечисления в строку

#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» }