Java MongoDb获取id作为时间戳,但需要十六进制字符串。

5

我正在对一个名为Schema的集合进行CRUD操作,需要将_id作为十六进制字符串检索出来,但是当我使用collection.find()时,我得到的是时间戳和日期,而不是字符串。

我收到的结构如下:

{
"_id": {
            "timestamp": 1604689898,
            "date": "2020-11-06T19:11:38.000+00:00"
        }
}

但我需要类似这样的内容:

{
"_id": "5fa5a085a4b09b307d53ed57"
}

以下是我的配置

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>co.com.itau</groupId>
    <artifactId>crypto-mongodb-java-ms</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>crypto-mongodb-java-ms</name>
    <description>Microservice to save and read data from mongoDB using CSFLE</description>

    <properties>
        <java.version>1.8</java.version>
        <version.fabric8-maven-plugin>3.5.41</version.fabric8-maven-plugin>
        <swagger.version>3.0.0</swagger.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency> 
            <groupId>io.springfox</groupId> 
            <artifactId>springfox-boot-starter</artifactId> 
            <version>${swagger.version}</version> 
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
          <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-crypt</artifactId>
            <version>1.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
    <profiles>
        <profile>
            <id>openshift</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>io.fabric8</groupId>
                        <artifactId>fabric8-maven-plugin</artifactId>
                        <version>${version.fabric8-maven-plugin}</version>
                        <executions>
                            <execution>
                                <id>fmp</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>resource</goal>
                                    <goal>build</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <generator>
                                <config>
                                    <spring-boot>
                                        <fromMode>isTag</fromMode>
                                        <from>redhat-openjdk18-openshift:1.2</from>
                                    </spring-boot>
                                </config>
                            </generator>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>

MongoClient 配置

CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build());
        CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);
        
        MongoClient mongoAux = MongoClients.create(MongoClientSettings.builder()
                .applyConnectionString(new ConnectionString(connectionString))
                .codecRegistry(codecRegistry)
                .build());
        
        return mongoAux;

模式模型

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Schema {
    
    @JsonProperty("_id")
    @SerializedName("_id")
    public ObjectId id;

    public String db;
    
    public String collection;
    
    public Document schema;
}

**代码仓库**

@Repository
public class SchemaMongoRepository implements SchemaRepository{


    @Value("${mongodb.schema.db}")
    private String mongoDatabase;

    @Value("${mongodb.schema.collection}")
    private String mongoCollection;
    
    
    private static final Logger logger = LoggerFactory.getLogger(SchemaMongoRepository.class);

    @Autowired
    private MongoClient mongoClient;
    
    @Autowired
    private DataKey datakey;
    
    private MongoCollection<Schema> schemaCollection;
    
    @PostConstruct
    void init() {
        schemaCollection = mongoClient.getDatabase(mongoDatabase).getCollection(mongoCollection, Schema.class);
    }

    @Override
    public List<Schema> getSchemas() {
    
        List<Schema> schemaList = new ArrayList<Schema>();
        FindIterable<Schema> result = schemaCollection.find();
        
        for(Schema currentSchema: result) {
            schemaList.add(currentSchema);
        }
        return schemaList;
    }
}
3个回答

5
你面临的问题是 ObjectId 变成了扩展对象(反序列化)。我们对其进行了序列化。在pom中添加以下依赖项即可解决此问题。
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0.rc1</version>
</dependency>

在主类中添加以下方法。
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer()
{
    return builder -> builder.serializerByType(ObjectId.class,new ToStringSerializer());
}

这将为您提供预期的输出结果。


我已经尝试了这个解决方案,但仍然出现这样一种情况:我在一个字段中有一个objectId数组,而返回时它将jobTypes返回为日期和时间戳。"jobTypes": [{"timestamp": 1683773584, "date": 1683773584000}, {"timestamp": 1683773591, "date": 1683773591000}]但它应该像下面这样"jobTypes": ["645c5890a24c041c3697d23f", "645c5897a24c041c3697d240"] - Rafi Mahmud
@RafiMahmud,你尝试在主类中添加了吗? - varman
是的,和你在答案中展示的一样。 - Rafi Mahmud

2
在我的例子中,使用Kotlin仅需添加一个Jackson JSON序列化器就能轻松实现:
@JsonSerialize(using = ToStringSerializer::class)
val id: ObjectId = ObjectId.get(),

为了得到以下内容:
{
    "id": "622b34af87c70514f6452363",
    ...
}

替代:

{
    "id": {
        "timestamp": 1646998703,
        "date": "2022-03-11T11:38:23.000+00:00"
    },
    ...
}

1
在Java 17中,将此注释添加到id变量中可以解决我的问题。
@JsonSerialize(using = ToStringSerializer.class)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接