Spring Boot和Spring Data MongoDB:隐藏ResponseBody中的字段

时间:2015-08-22 14:36:44

标签: java spring mongodb spring-boot

我正在使用Spring Boot和spring-boot-starter-data-mongodb包。

我已成功创建了一种方法来返回我的应用的帐户信息:

public Account queryAccountInfo(String userId) {
    Query query = new Query();
    query.addCriteria(Criteria.where("userId").is(userId));
    return mongoTemplate.findOne(query, Account.class);
}

现在,这将返回Account类中的所有信息,这是我创建的自定义类:

    public class Account {

        public Account(){}


        @Id
        private String id;
        private String email;
        private String token; 
}

现在,Spring将在ResponseBody对象中返回整个Account对象,因此它将创建一个类似于此的JSON:

{
  "id": "1234567890",
  "email": "Google@google.com",
  "token": "XXX-XXX-XXX"}

我不希望它返回“令牌”,因为这是敏感信息。如何让Spring不返回“令牌”字段但返回其他所有内容?

我确信有一个Spring注释可以让我这样做,但我似乎无法找到它:http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/annotation/package-frame.html

3 个答案:

答案 0 :(得分:1)

方法应该是:

query.fields().exclude("token");

答案 1 :(得分:0)

您的实际问题是缺少mongodb bean对象和API中使用的对象的分离。虽然在项目的PoC阶段没有必要这样做,当遇到这样的问题时,你应该添加第二组用于通信的bean,并在用于spring-data-mongo的对象之间进行映射。

答案 2 :(得分:0)

等效 Mongo查询

db.account.aggregate({$ project:{email:1}})

科迪哥·科特林:

package com.integracion.controller
import com.integracion.modelo.Account

import org.springframework.data.mongodb.core.*
import org.springframework.data.mongodb.core.aggregation.Aggregation
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation

import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query
import org.springframework.data.mongodb.core.query.Query.query

@RestController
@EnableReactiveMongoRepositories(basePackageClasses = arrayOf(AccountRepository::class))

class InicioController {
    @Autowired
    private lateinit var accountRepository: AccountRepository
    @Autowired
    private lateinit var query: MongoTemplate

@GetMapping("v2/filtro")
    //Query es la libreria import org.springframework.data.mongodb.core.query.Query.query
    fun filtro (q: Query): Document {
        /*
           // Equivalente en MongoDB //
              db.account.find({},{email:1})
           //Manera simple pero devulve los excluidos con campos vacios null ""
        q.fields().include("email").exclude("token");
        var consulta : List<Account> = query.find(q,Account::class.java)*/


// =) 

        /* //Equivalente en MongoDB//
        db.account.aggregate({$project:{email:1}}) */


        var p: ProjectionOperation = Aggregation.project("email")
        var a: Aggregation = Aggregation.newAggregation(p)
        var resultado: Document = query.aggregate(a,"account",Account::class.java).rawResults

        return resultado
    }
}