我正在尝试将 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/
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在使用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.
我知道我可以指定某些字段来使用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
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
我正在尝试使用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
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我