我想在处理Spring数据休息时寻求应用业务规则的最佳实践。
让我们考虑以下情况:
Customer
关系中有Order
和@OneToMany
。Customer
需要设置已验证标志才能发出订单所以我需要确保只要POST
/orders
Customer
Validator
打电话的人export default class TextInputField extends React.Component<IComponentProps, IComponentState> {
constructor(props: IComponentProps) {
super(props)
}
static defaultProps = {
isMultiline: false,
nextButtonText: "Next",
onSubmit: () => true,
showNextButton: true,
}
public render() {
const {
keyboardType,
label,
nextButtonText,
onSubmit,
placeholderText,
showNextButton,
isMultiline
} = this.props
const textBoxHeight = isMultiline ? 150 : 50
return (
<View>
<Text style={styles.label}> {this.props.label} </Text>
<TextInput
multiline={isMultiline}
numberOfLines={5}
style={[styles.textInput, { height: textBoxHeight }]}
placeholder={placeholderText}
placeholderTextColor={colors.light_gray}
keyboardType={keyboardType}
onBlur={showNextButton ? undefined : onSubmit}
/>
{showNextButton &&
<MyButton
title={nextButtonText}
onPress={onSubmit}
/>
}
</View>
)
}
}
。
我正在考虑使用 beforeSave Validators将其他服务/存储库自动装入{{1}}并检查需要检查的内容。
有没有更好的方法来实现同样的目标?
答案 0 :(得分:3)
有几种方法可以解决这个问题。据我所知:
使用@PreAuthorize
之类的spring安全注释。但是,为了安全起见,这些注释的预期用途是您提到的业务规则。我会将这些用于用户授权规则Spring data rest security chapter
正如您自己提到的那样使用验证器。 Spring data rest Validators
使用spring数据休息事件Spring data rest events。您可以创建全局事件处理程序,但是在这里您需要确定实体类型。我会使用Annotated事件处理程序来执行业务逻辑Spring data rest annotated event handler
答案 1 :(得分:0)
您可以使用一个开箱即用的解决方案来解决与业务规则相关的问题,使用Spring AOP。你可以做的是定义一个注释(比如说@X)并将这个注释放在你的POST调用之上。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface X{}
接下来你需要做的是,创建一个方面,并在这方面运行自定义验证逻辑,如下所示,
@Aspect
@Component
public class CustomAspect {
//You can autowire beans here
@Around("@annotation(qualified name of X)")
public Object customMethod(ProceedingJoinPoint joinPoint) throws Throwable {
flag = customLogic();
if (flag){
return joinPoint.proceed(); //return if logic passes, otherwise
}else{
throw new BusinessRuleException("Business rule violated");
}
}
private boolean customLogic(){
//your custom logic goes here
}
}
最后在控制器层中的任何方法之上应用此注释,如:
@X
@RequestMapping(method = RequestMethod.POST, value = "do-something")
public void callSomething(HttpServletRequest request) throws Exception {
// your business logic goes here
}
上面要注意的是,您需要将 HttpServletRequest请求显式传递给您的控制器方法,以便AOP方面获得相同的上下文来操作与session_id等用户会话相关的属性。 / p>
以上解决方案将帮助您在业务逻辑之上添加业务规则,并帮助您进行要在Web应用程序中构建的各种预验证。它是Spring AOP的一个非常方便的应用程序。如果有任何
,请伸手可及答案 2 :(得分:0)
所以只是为了世界篇,我正在添加我的解决方案。去了#2。
documentation非常清楚如何继续,所以只需分享一些可以节省时间的提示。
Enum
可能很方便。像:
/**
* "beforeSave" gets called on PATCH/PUT methods
* "beforeCreate" on POST
* "beforeDelete" on DELETE
*/
enum Event {
ON_CREATE("beforeCreate"), ON_UPDATE("beforeSave"),
ON_DELETE("beforeDelete");
private String name;
Event(String name) {
this.name = name;
}
}
...
private static void addValidatorForEvents(ValidatingRepositoryEventListener eventListener, Validator validator, Event... events) {
Arrays.asList(events).forEach(event -> eventListener.addValidator(event.name, validator));
}