草庐IT

java - 排除Spring-data-rest资源的部分字段

coder 2023-08-31 原文

我正在尝试将 Spring-data-rest 与 spring-data-mongodb 结合使用来公开只读资源。

我遇到的问题是,我想对我的文档有不同的看法。 假设我在文档中有一些私有(private)信息,我不想公开它们。

所以我尝试了几种方法。 我读了这篇文章https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring描述如何使用 JsonView 来选择我们想要公开的字段。

我试过这样的:

@RepositoryRestResource(collectionResourceRel = "recommandation", path =    "recommandations")
interface RecommandationRepository extends MongoRepository<Recommendation,   ObjectId> {

@Override
@JsonView(View.Public.class)
Iterable<Recommendation> findAll(Iterable<ObjectId> objectIds);
... // other find methods
}

这是行不通的。然而在评论中说:https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#comment-1725671983 答案建议使用@Projections 但是 @Projections 会产生这样的 url:“…/recommandations{?projection}” 这意味着投影只是一个选项,所以完整的对象仍然暴露在外。

此处描述了另一种方法 https://github.com/spring-projects/spring-data-rest/wiki/Configuring-the-REST-URL-path 它建议对我们不想公开的字段使用 @RestResource(exported = false) 注释。

但它不灵活。如果我想公开一个公共(public)只读 API 和一个私有(private)完全访问 API。不能按 API 禁用此注释。

还有其他建议吗?

最佳答案

重要的一点是 Spring Data REST 使用基于域对象的 Jackson 序列化参数,而不是存储库定义。隐藏特定字段不出现在 JSON 中的一种简单方法如下:

@Entity
public class User {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @JsonIgnore
    private String password;
    ...

在这个例子中,我的用户对象永远不会导出密码字段,无论这个实体如何使用。 Jackson 支持把这个放在字段上,或者放在相应的 getter 方法上。

当您将 @JsonIgnore 放入域模型时,它会成为默认定义。投影是改变渲染字段的选项。看下面的例子:

@Projection(name = "noImages", types = {Item.class})
public interface NoImages {

    public Link getHtmlUrl();

}

这个项目只能在渲染Item领域对象时使用。它不是默认 View ,而是通过 ?projection=noImages 使用的选项。但不要忘记:当需要应用 Jackson 序列化时,项目将覆盖域模型的设置。这意味着您可以为上面的 User 对象编写一个投影,并让它包含 String getPassword()。这将覆盖域模型的默认设置,进而导出密码。责任在你。

最后一件事。 Spring Data REST 支持Excerpt Projections。最常见的用例是您有一个与 Address 对象相关的 Customer 对象。默认情况下,查看客户地址的关系将显示要导航的 URI。但是,如果您一直需要地址信息,则可以通过创建呈现地址详细信息的投影来避免这种额外的 GET 操作。然后,您可以为 Customer 对象配置它,默认情况下打开此投影,并在您获取客户记录时基本上内联地址详细信息。

我意识到引用文档在所有这些细节上都不是最新的。您可以跟踪我们的进度以适本地更新文档,如下所示:

还有一个错误是来自 Spring Data REST 的 ALPS 元数据也需要过滤掉标记为 @JsonIgnore 的域字段(参见 https://jira.spring.io/browse/DATAREST-463 )

附言@RestResource 已弃用,不是设置要导出哪些字段的推荐方法。相反,如前所示使用 @JsonIgnore

关于java - 排除Spring-data-rest资源的部分字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28322376/

有关java - 排除Spring-data-rest资源的部分字段的更多相关文章

  1. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  2. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  7. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐