我无法访问域类中的漏洞属性 - 场景,来自我的java类 - MatchScenario,位于Grails src文件夹中。
已经尝试过:
显式方法: 我试过明确创建get; set;但是我得到stackOverflow错误,因为setExploits()由于某种原因被自己无限地调用。
返回漏洞利用字段的服务, 尽管该服务已经创建,但它从未在我的fork-debug集成测试中调用,因此测试毫无例外地挂起
编译错误 - >
Error:(59, 44) java: cannot find symbol
symbol: variable exploits
location: variable scenario of type core.Scenario
Java类,内循环错误 - >
public class MatchScenario implements Callable{
private static final Logger LOG = Logger.getLogger(MatchScenario.class.getCanonicalName());
private List<Scenario> scenarioList
@Override
public List<Scenario> call() throws Exception {
LOG.debug( "*********************** schedule matcher called *****************************" );
if (scenarioList==null) {
LOG.debug("scenarioList not initialized ");
return null;
}
List<Scenario> scenarioAvailable = new ArrayList<Scenario>();
for (Scenario scenario : scenarioList){
for (Exploit exploit : scenario.exploits){
//println 'exploit -> '+exploit
if (!match( exploit.getExpression() ) ){
break;
}
}
//happens only when all scenario are available ( no break issued )
scenarioAvailable.add(scenario);
}
return scenarioAvailable;
}
private boolean match(String expression) {
return true;
}
}
场景域对象 - &gt;
package core
class Scenario {
String name
static belongsTo = [ Exploit ]
static hasMany = [ exploits : Exploit ]
static constraints = {
name nullable: false , maxSize: 32
}
}
答案 0 :(得分:1)
你混淆了字段和属性。在Groovy类中声明属性时,例如String name
,Groovy编译器将其转换为私有字段并添加getter和setter(除非您已经定义了其中一个或两个 - 它不会覆盖),在这种情况下类似
private String name
public void setName(String name) { this.name = name }
public String getName() { return name }
只有在没有范围修饰符的情况下才会这样做,因此public String name
和protected String name
都会保持定义。
这样做的一个好处是,您可以稍后向getter和/或setter添加逻辑以修改值,执行一些验证检查或计算等,而在Groovy中,您仍然可以读取和写入{{1由于属性访问总是调用底层的setter和getter,因为像这样的属性只是Java无法访问的Groovy,所以你一直在用Java调用setter和getter,所以你不需要重新编译使用该类的Java类。
声明与您相同的name
会有效地创建hasMany
属性
exploits
并且该属性(通过Grails AST转换添加)同样转换为具有getter和setter的私有字段。因此,要使用Java,请使用getter:
Set<Exploit> exploits