Spring数据休息和业务规则验证

时间:2018-02-15 09:46:36

标签: spring spring-data-rest business-rules

我想在处理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}}并检查需要检查的内容。

有没有更好的方法来实现同样的目标?

3 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。据我所知:

  1. 使用@PreAuthorize之类的spring安全注释。但是,为了安全起见,这些注释的预期用途是您提到的业务规则。我会将这些用于用户授权规则Spring data rest security chapter

  2. 正如您自己提到的那样使用验证器。 Spring data rest Validators

  3. 使用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非常清楚如何继续,所以只需分享一些可以节省时间的提示。

  1. 您需要assign validators manually,自动发现doesn't work
  2. 手动拼写事件类型容易出错,有些助手Enum可能很方便。
  3. 像:

    /** 
     * "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));
    }