Редактировать: я нашел связанный вопрос здесь , но только 2 ответа противоречат друг другу, и не было достаточно информации для рассмотрения моего варианта использования.
Я пытаюсь использовать Spring Data Mongo для загрузки записей из коллекции. Одним из полей в этих записях является Enum, определенный следующим образом:
@AllArgsConstructor
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Action {
APPROVED("Approved"),
SAVED("Saved"),
CORRECTED("Corrected");
private String name;
@JsonCreator
static Action findValue(@JsonProperty("name") String name) {
return Arrays.stream(Action.values()).filter(v -> v.name.equals(name)).findFirst().get();
}
}
Это должно определить перечисления для сериализации и десериализации в соответствии с представлением JSON: {"name": "Saved"}
, например.
Джексон, кажется, работает нормально, так как я бросил вызов API и сказал ему ожидать тип Action
, и он без проблем прочитал перечисление.
public void save(@RequestBody @Valid Action action) {
System.out.println(action.getName());
} // successfully prints the name of whatever Action I give
Однако, когда я пытаюсь прочитать объект с полем Action, используя Spring Data Mongo, я получаю следующее:
Expected to read Document Document{{name=Corrected}} into type class package.structure.for.some.proprietary.stuff.constants.Action but didn't find a PersistentEntity for the latter!
Так что я думаю, что Spring Data Mongo просто не может делать головы или хвосты этих перечислений по любой причине. Но я не уверен, как помочь ему зарегистрировать это как PersistentEntity. Основной класс моего приложения Spring Boot находится в пакете package.structure.for.some.proprietary.stuff
и помечается так:
@ComponentScan("package.structure")
@EnableTransactionManagement
@EnableAutoConfiguration
@SpringBootApplication
Объект, в частности, который я пытаюсь прочитать, определяется этим POJO:
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;
import lombok.NonNull;
import package.structure.for.some.proprietary.stuff.constants.Action;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"timeStamp",
"action",
})
@Data
@Document(collection = "sample_coll")
public class Sample {
@Id
@JsonIgnore
private String id = null;
@JsonProperty("timeStamp")
@NonNull
private Date timeStamp;
@JsonProperty("action")
@NonNull
private Action action;
}
и запрашивается из коллекции с репозиторием Mongo:
public interface SampleRepository extends MongoRepository<Sample, String> {
}
с использованием SampleRepository.findAll();
Итак, мой главный вопрос: как заставить Spring Data Mongo распознавать это перечисление Action как PersistentEntity?