无法从Java类访问域属性(在src文件夹中)

时间:2015-04-20 14:35:34

标签: grails

我无法访问域类中的漏洞属性 - 场景,来自我的java类 - MatchScenario,位于Grails src文件夹中。

已经尝试过:

  1. 显式方法: 我试过明确创建get; set;但是我得到stackOverflow错误,因为setExploits()由于某种原因被自己无限地调用。

  2. 返回漏洞利用字段的服务, 尽管该服务已经创建,但它从未在我的fork-debug集成测试中调用,因此测试毫无例外地挂起

  3. 编译错误 - >

    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
        }
    }
    

1 个答案:

答案 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 nameprotected 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