197*_*977 11 spring-data-rest spring-boot spring-rest
寻找有关正确处理验证错误的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();
}
Run Code Online (Sandbox Code Playgroud)
...
和这个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> {
}
Run Code Online (Sandbox Code Playgroud)
POST请求api /公司:
{
"address" : "One Microsoft Way",
"city" : "Redmond",
"country" : "USA",
"email" : "info@microsoft.com",
"phoneNumber" : "(425) 703-6214"
}
Run Code Online (Sandbox Code Playgroud)
当我发出一个带有空名称的POST时,我得到了httpcode 500的以下休息响应
{"timestamp":1455131008472,"status":500,"error":"内部服务器错误","异常":"javax.validation.ConstraintViolationException","message":"类验证失败[com.domain.Company ]在持久化时间组[javax.validation.groups.Default,] \n约束违规列表:[\n\t \nConstraintViolationImpl {interpolatedMessage ='可能不为空',propertyPath = name,rootBeanClass = class com.domain.Company, messageTemplate = '{javax.validation.constraints.NotNull.message}'} \n]的", "路径": "/ API /公司/"}
我尝试创建以下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");
}
}
Run Code Online (Sandbox Code Playgroud)
即使它确实有效,它如何通过正确的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>
Run Code Online (Sandbox Code Playgroud)
@Mathias似乎以下内容足以检查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);
}
Run Code Online (Sandbox Code Playgroud)
}
响应404,{"errors":[{"entity":"Company","message":"may not null","invalidValue":"null","property":"name"},{"entity" :"公司","消息":"可能不为空","invalidValue":"null","property":"address"}]}
我认为您的问题是 bean 验证发生得太晚了 - 它是在持久化之前在 JPA 级别完成的。我发现 - 与 spring mvc 不同 - spring-data-rest 在调用控制器方法时没有进行 bean 验证。为此,您将需要一些额外的配置。
您希望 spring-data-rest 验证您的 bean - 这将为您提供很好的错误消息响应和正确的 http 返回代码。
我在 spring-data-rest 中配置了我的验证,如下所示:
@Configuration
public class MySpringDataRestValidationConfiguration 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();
}
@Bean
//the bean name starting with beforeCreate will result into registering the validator before insert
public BeforeCreateCompanyValidator beforeCreateCompanyValidator() {
return new BeforeCreateCompanyValidator();
}
@Override
public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
Validator validator = validator();
//bean validation always before save and create
validatingListener.addValidator("beforeCreate", validator);
validatingListener.addValidator("beforeSave", validator);
}
}
Run Code Online (Sandbox Code Playgroud)
当 bean 验证和/或我的自定义验证器发现错误时,我收到一个 400 - 错误的请求,负载如下:
Status = 400
Error message = null
Headers = {Content-Type=[application/hal+json]}
Content type = application/hal+json
Body = {
"errors" : [ {
"entity" : "siteWithAdminUser",
"message" : "may not be null",
"invalidValue" : "null",
"property" : "adminUser"
} ]
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6815 次 |
最近记录: |