gpt4 book ai didi

spring-boot - Spring Data Rest验证混淆

转载 作者:行者123 更新时间:2023-12-04 00:56:00 24 4
gpt4 key购买 nike

寻求有关正确处理验证错误的 Spring 数据休息验证的帮助:

我对这里关于 spring-data-rest 验证的文档很困惑:http://docs.spring.io/spring-data/rest/docs/current/reference/html/#validation

我正在尝试正确处理试图保存新公司实体的 POST 调用的验证

我得到了这个实体:

@Entity
public class Company implements Serializable {

@Id
@GeneratedValue
private Long id;

@NotNull
private String name;

private String address;

private String city;

private String country;

private String email;

private String phoneNumber;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "company")
private Set<Owner> owners = new HashSet<>();

public Company() {
super();
}

...

而这个 RestResource dao
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RestResource;

import com.domain.Company;

@RestResource
public interface CompanyDao extends PagingAndSortingRepository<Company, Long> {


}

对 api/公司的 POST 请求:
{
"address" : "One Microsoft Way",
"city" : "Redmond",
"country" : "USA",
"email" : "info@microsoft.com",
"phoneNumber" : "(425) 703-6214"

}

当我发出一个带有空名称的 POST 时,我得到了以下带有 httpcode 500 的 rest 响应

{"timestamp":1455131008472,"status":500,"error":"内部服务器错误","exception":"javax.validation.ConstraintViolationException","message":"类验证失败[com.domain.Company ] 在组的持续时间内 [javax.validation.groups.Default, ]\n约束违规列表:[\n\tConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=name, rootBeanClass=class com.domain.Company, messageTemplate='{javax.validation.constraints.NotNull.message}'}\n]","path":"/api/companies/"}

我尝试创建以下 bean,但它似乎从来没有做任何事情:
@Component(value="beforeCreateCompanyValidator")
public class BeforeCreateCompanyValidator implements Validator{

@Override
public boolean supports(Class<?> clazz) {
return Company.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object arg0, Errors arg1) {
System.out.println("xxxxxxxx");


}

}

即使它确实有效,它如何帮助我使用正确的 http 代码和可理解的 json 响应开发更好的错误响应?

如此迷茫

使用 1.3.2.RELEASE
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

最佳答案

@马蒂亚斯
似乎以下内容足以检查 jsr 303 注释并使其自动返回带有漂亮消息的 400 的 http 代码(我什至不需要 BeforeCreateCompanyValidator 或 BeforeSaveCompanyValidator 类):

@Configuration
public class RestValidationConfiguration extends RepositoryRestConfigurerAdapter{

@Bean
@Primary
/**
* Create a validator to use in bean validation - primary to be able to autowire without qualifier
*/
Validator validator() {
return new LocalValidatorFactoryBean();
}


@Override
public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
Validator validator = validator();
//bean validation always before save and create
validatingListener.addValidator("beforeCreate", validator);
validatingListener.addValidator("beforeSave", validator);
}

}

400 响应:
{
"errors": [{
"entity": "Company",
"message": "may not be null",
"invalidValue": "null",
"property": "name"
}, {
"entity": "Company",
"message": "may not be null",
"invalidValue": "null",
"property": "address"
}]
}

关于spring-boot - Spring Data Rest验证混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35323974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com