4

我这里有个小问题。即使它与 Xtext 有关,我认为该解决方案可能与 java 相关。

我正在使用 Xtext 创建一个运行良好的语法。语法有一个名为 BufferValidator 的现有验证。其正确定义为

public class BufferValidator extends AbstractSPJavaValidator {

// Validation methods which work fine 

}

我添加了另一个 .

public class FreqValueValidator extends AbstractSPJavaValidator{

    // Some new validation methods

}

现在,当我运行项目时,会自动创建文件夹 src-gen/ 并在名为 AbstractSPJavaValidator 的文件中包含验证信息。

**Snip**
@ComposedChecks(validators= {gem.demo.validation.BufferValidator.class})
public class AbstractSPJavaValidator extends AbstractDeclarativeValidator {

          // Methods here 
        }

}

显然我的新验证器没有添加到@ComposedChecks validators. 现在,如果我自己在文件中添加我的验证器(理想情况下我不应该这样做,因为该文件是自动生成的)它按预期工作。

知道我在这里可能缺少什么。对于初学者,我确实在添加新的验证类后重新创建/重新生成了语法符号。

4

1 回答 1

3

我希望我正确理解您的情况:

BufferValidator是自动生成的验证器,默认情况下只有那些验证有效。您想添加另一个名为 ValidatorFreqValueValidator并且仅在您操作src-gen文件夹中的抽象类时才有效,该类将被下一个构建的覆盖。

您可以拆分验证器并在“主”验证器中定义它们,BufferValidator在您的情况下,使用@ComposedChecks注释。在子验证器中,您必须覆盖该register方法。它不是必需的,也不应该调用超级方法,只需将其留空并添加注释即可。

缓冲区验证器:

@ComposedChecks(validators = { FreqValueValidator.class })
public class BufferValidator extends AbstractSPJavaValidator {

// Validation methods which work fine 

}

频率值验证器:

public class FreqValueValidator extends AbstractDeclarativeValidator {

    @Override
    @Inject
    public void register(EValidatorRegistrar registrar) {
        // nothing to do
    }

    // Some new validation methods
}

我从官方 xtext 支持论坛获得了这个解决方案,但不幸的是没有再次找到该线程。我正在使用它,它就像一个魅力。我希望我在上面的代码中做对了,它未经测试。但它应该让你继续前进。

于 2013-06-26T10:18:57.947 回答