Spring Data Mongo не может найти PersistentEntity для Enum - PullRequest
0 голосов
/ 05 июня 2019

Редактировать: я нашел связанный вопрос здесь , но только 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?

1 Ответ

0 голосов
/ 05 июня 2019

Try @ Enumerated

@Enumerated
@JsonProperty("action")
@NonNull
private Action action;
...