【问题标题】:Spring Boot POSTed JSON data validationSpring Boot POSTed JSON 数据验证
【发布时间】:2014-08-10 16:34:48
【问题描述】:

我有发布请求的控制器:

@RequestMapping(value="/projects/add", method=RequestMethod.POST)
@ResponseBody
public String addProject(@Valid @RequestBody usersProjects project, BindingResult result) {
    if(result.hasErrors()) {
        System.out.println("Error ::: " +result.toString());
    }

    logger.info(project.toString());

    usersProjects.addProject(project);

    return "ok";
}

数据库表的实体:

@Entity
@Table(name="users_projects")
public class UsersProjects {

    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Long id;

    @NotEmpty
    private String name;

    private Boolean approved;

    @NotEmpty
    @ElementCollection
    private List<String> spaces;
    @NotEmpty
    @ElementCollection
    private List<String> owners;

    @OneToMany(cascade=CascadeType.ALL, 
             fetch=FetchType.EAGER)
    private Set<UsersProjectJobs> jobs;

    @OneToMany(cascade=CascadeType.ALL, 
             fetch=FetchType.EAGER)
    private Set<UsersProjectData> data;


    public UsersProjects() {

    }

    public UsersProjects(String name, List<String> spaces, List<String> owners) {
        this.name = name;
        this.spaces = spaces;
        this.owners = owners;
        this.approved = false;
    }

    public Boolean getApproved() {
        return approved;
    }
    public void setApproved(Boolean approved) {
        this.approved = approved;
    }
}

当我尝试使用 CURL 将数据发布到服务器时:

curl -i  -H "Content-Type:application/json" -H "Accept:application/json"  -X POST -d '{ "name": "123", "spaces": ["123"], "owners": ["123"]}' http://localhost:8080/projects/add

得到错误:

客户端发送的请求语法错误。

我发现很多主题都描述了当 Spring 无法验证收到的 JSON 数据时会发生此错误。我应该添加到 log4j.properties 以获得更详细的输出,或者也许有人知道关于模型验证的好主题的链接?

谢谢。

UPD log4j 配置:

# Root logger option
log4j.rootLogger=DEBUG, stdout

log4j.logger.org.springframework=DEBUG, stdout
log4j.logger.org.springframework.beans=DEBUG, stdout
log4j.logger.org.springframework.context=DEBUG, stdout
log4j.logger.org.springframework.http=DEBUG, stdout
log4j.logger.org.springframework.web=DEBUG, stdout
log4j.logger.org.hibernate=DEBUG, stdout
log4j.category.org.springframework.beans.factory=DEBUG, stdout

log4j.logger.org.apache.catalina.core=DEBUG
log4j.logger.org.apache.catalina.session=DEBUG

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

UPD UPD

public class validatorAddProject {
    private String name;
    private List<String> spaces;
    private List<String> owners;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<String> getSpaces() {
        return spaces;
    }
    public void setSpaces(List<String> spaces) {
        this.spaces = spaces;
    }
    public List<String> getOwners() {
        return owners;
    }
    public void setOwners(List<String> owners) {
        this.owners = owners;
    }
}


@RequestMapping(value="/projects/add", method=RequestMethod.POST)
@ResponseBody
public String addProject(@Valid @RequestBody validatorAddProject form, BindingResult result) {
    if(result.hasErrors()) {
        System.out.println("Error ::: " +result.toString());
    }

    usersProjects project = new usersProjects(form.getName(), form.getSpaces(), form.getOwners());
    usersProjects.addProject(project);

    return "ok";
}

【问题讨论】:

  • 这是完整的UsersProjects 课程吗?这是处理程序方法中的一种类型吗?将您的日志转为 DEBUG 并再次查看。
  • 我的 log4j.properties 文件:pastebin.com/6KuuYT61 我在这里没有看到任何关于验证错误的记录。是的,它是完整的实体类。
  • 您的日志应包含有关您为何获得 400 的信息。检查它们。如果没有,说明您的记录器配置错误。
  • @AlexanderGryanko 请将您的 log4j.properties 添加到帖子中,不要让人们通过链接获取所有信息。
  • 如果这是您的完整课程,您缺少一些 getter/setter,因此不会进行绑定。除非您将 Jackson 配置为进行基于字段的绑定,否则默认情况下它会进行属性(获取/设置)绑定。

标签: java json spring hibernate spring-boot


【解决方案1】:

有一个很好的project,它展示了如何处理例如验证错误。 看看MethodArgumentNotValidExceptionHandler

【讨论】:

  • 谢谢,但这不是我想要的。我通过将 slf4j 添加到项目中找到了解决方案。
【解决方案2】:

我认为您需要添加 setter 或使用 @JsonCreator 装饰您的构造函数。另外升级到最新的引导版本,如果你正在使用它(我从标签中猜测),应该在响应中公开BindingException,如果它是这样的话。

【讨论】:

  • 谢谢。我已将 JsonCreator 和 JsonProperty 添加到 Entity 类中,它可以工作,但不像我想要的那样。我创建了另一个公共类,只包含我想添加到数据库的字段。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2017-02-08
  • 2015-08-09
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多