Spring Data Mongo cannot find PersistentEntity for

2019-08-21 08:34发布

Edit: I found a related question here, but the only 2 answers contradict each other, and there was not enough information to address my use case.

I am trying to use Spring Data Mongo to load records from a collection. One of the fields within those records is an Enum, defined as such:

@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();
    }
}

This should define enums to be serialized and deserialized according to a JSON representation: {"name": "Saved"} for example.

Jackson seems to be working fine, since I threw an API call at it and told it to expect an Action type, and it read the enum without any issues.

public void save(@RequestBody @Valid Action action) {
    System.out.println(action.getName());
} // successfully prints the name of whatever Action I give

However, when I try to read an object with an Action field using Spring Data Mongo, I get the following:

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!

So I'm thinking Spring Data Mongo just can't make heads or tails of these enums for whatever reason. But I'm not sure how to help it register that as a PersistentEntity. The main class of my Spring Boot app is in package package.structure.for.some.proprietary.stuff and is annotated as such:

@ComponentScan("package.structure")
@EnableTransactionManagement
@EnableAutoConfiguration
@SpringBootApplication

The object in particular I'm trying to read is defined by this 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;
}

and is queried from the collection with a MongoRepository:

public interface SampleRepository extends MongoRepository<Sample, String> {

}

using SampleRepository.findAll();

So my big question is, how do I get Spring Data Mongo to recognize this enum Action as a PersistentEntity?

1条回答
【Aperson】
2楼-- · 2019-08-21 09:33

Try @Enumerated

@Enumerated
@JsonProperty("action")
@NonNull
private Action action;
查看更多
登录 后发表回答