当前位置: 首页 > 知识库问答 >
问题:

Spring CrudRepository save()不POST,因为它认为它的参数为null

苏宏逸
2023-03-14

我使用Spring Rest 4(spring-boot-starter-data-jpa,spring-boot-starter-data-rest,spring-boot-starter-security)和CrudRepository来访问我的Org数据。GET和PUT工作正常,但我的帖子总是从浏览器中看到一个空对象。

2017-08-30 06:27:00.049 ERROR 1312 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.logicaltiger.exchangeboard.model.Org] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=userId, rootBeanClass=class com.logicaltiger.exchangeboard.model.Org, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=address1, rootBeanClass=class com.logicaltiger.exchangeboard.model.Org, messageTemplate='{org.hibernate.validator.constraints.NotEmpty.message}'}
    ...
] with root cause

javax.validation.ConstraintViolationException: Validation failed for classes [com.logicaltiger.exchangeboard.model.Org] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=userId, rootBeanClass=class com.logicaltiger.exchangeboard.model.Org, messageTemplate='{javax.validation.constraints.NotNull.message}'}
    ConstraintViolationImpl{interpolatedMessage='may not be empty', propertyPath=address1, rootBeanClass=class com.logicaltiger.exchangeboard.model.Org, messageTemplate='{org.hibernate.validator.constraints.NotEmpty.message}'}
    ...
]
$("#OrgPostBtn").click(function() {
    $.ajax({
        url: "/org",
        type: "POST",
        data: JSON.stringify({  provider: true, name: 'Org NEW', address1: 'Address 24',  [SNIP],  userId: 2 }),
        contentType: "application/json; charset=utf-8",
        headers: createAuthorizationTokenHeader(),
        dataType: "json",
        success: function (data, textStatus, jqXHR) {
            console.log("success: data: " + data + ", textStatus: " + textStatus + ", jqXHR: " + jqXHR);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log("error: jqXHR: " + jqXHR + ", textStatus: " + textStatus);
        }
    });
});

下面是存储库:

@RepositoryRestResource(path="org")
public interface OrgRepository extends CrudRepository<Org, Long> {

    @Override
    @PostAuthorize("returnObject.userId == principal.id || hasRole('ROLE_ADMIN')")
    public Org findOne(@Param("id") Long id);

    @Override
    @PostFilter("filterObject.user_id == principal.id || hasRole('ROLE_ADMIN')")
    public Iterable<Org> findAll();

}

下面是org的一个删节版本:

@Entity
@Table(name="org")
public class Org implements Serializable {
    private static final long serialVersionUID = -2808050088097500043L;

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id = Utilities.INVALID_ID;

    @Column(name="provider", nullable=false)
    @NotNull
    private boolean provider;

    @Column(name="name", length=100, nullable=false)
    @NotEmpty
    @Size(max=100)
    private String name;

    @Column(name="address1", length=50, nullable=false)
    @NotEmpty
    @Size(max=50)
    private String address1;

    @Column(name="user_id", nullable=false)
    @NotNull
    private Long userId;

    [SNIP]
}

所以我没有对PUT或POST进行特殊处理,并且PUT处理得很好。但我的帖子数据没有被识别。

@Override
@SuppressWarnings("unchecked")
@PreAuthorize("#entity.userId == principal.id || hasRole('ROLE_ADMIN')")
public Org save(@Param("entity") Org entity);   

提前感谢,

杰罗姆。

共有1个答案

万浩淼
2023-03-14

我已经知道如何为PUT和POST配置这个存储库。在授权后使用returnobject,如下所示:

@RepositoryRestResource(path="org")
public interface OrgRepository extends CrudRepository<Org, Long> {

    @Override
    @PostAuthorize("returnObject.userId == principal.id || hasRole('ROLE_ADMIN')")
    public Org findOne(@Param("id") Long id);

    @Override
    @PostFilter("filterObject.userId == principal.id || hasRole('ROLE_ADMIN')")
    public Iterable<Org> findAll();

    @Override
    @SuppressWarnings("unchecked")
    @PostAuthorize("reutrnObject.userId == principal.id || hasRole('ROLE_ADMIN')")

}

有了这个,我得到了:一个普通用户只能把他/她自己的Org记录(用户ID匹配)。普通用户可以发布任何内容。管理员可以放置或张贴任何东西。

 类似资料:
  • 静态编程语言全局函数: 用java调用此函数: 它会给出以下错误:无法解析方法'show WarningDialog(com.us.stickermaker.backgroundRemover.##################################################################################################### 该

  • 我不明白Liquibase到底有什么问题,因为路径指定正确 应用yml文件: 编辑1项目结构 使用编译的类编辑2个文件夹

  • 我对有问题: 应用程序启动时会显示警告: 警告7388---[main]组织。冬眠orm。弃用:HH90000014:发现使用弃用的[org.hibernate.id.SequenceHiLoGenerator]基于序列的id生成器;使用组织。冬眠id.enhanced。相反,SequenceStyleGenerator。有关详细信息,请参阅《Hibernate域模型映射指南》 我试图找出如何用新

  • 问题内容: 由于JavaScript不是从Java派生的,为什么它的名称中带有“ Java”? 问题答案: JavaScript最初名为Mocha,后来又重命名为LiveScript,然后又重命名为JavaScript。 将LiveScript更改为JavaScript的名称是因为Netscape和Sun达成了许可协议。 然后将该语言提交给ECMA国际组织进行标准化处理。到那时,Netscape不

  • 为什么在这种情况下两个数组的作用不同?

  • 我的系统是Linux Mint 18.3 Cinnamon 64位。 我已经使用软件管理器安装了IntelliJ-IDEA和Default-jdk(openjdk-8-jdk)。 甚至不确定如何使用从命令行启动IDEA,例如,测试问题是否与权限相关,因为它显然是通过FlatPak代理启动的。 看来这应该很简单。我不确定我做错了什么。