Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Roo DataOnDemand和getNewTransientObject方法的定制?_Java_Integration Testing_Spring Roo - Fatal编程技术网

Java Spring Roo DataOnDemand和getNewTransientObject方法的定制?

Java Spring Roo DataOnDemand和getNewTransientObject方法的定制?,java,integration-testing,spring-roo,Java,Integration Testing,Spring Roo,在SpringRoo托管实体的集成测试中,我们在使用AspectJ混合风格接口时遇到了一个问题,该接口不仅引入了带有默认实现的方法,而且还添加了一个用JSR303验证规则注释的属性。问题是Spring Roo DataOnDemand逻辑没有看到这些字段,因此在getNewTransientObject()方法中没有考虑这些字段。 例如,以下(简化的)接口向实现“键控”接口的每个实体添加一个“键”字段: import javax.persistence.Column; import javax

在SpringRoo托管实体的集成测试中,我们在使用AspectJ混合风格接口时遇到了一个问题,该接口不仅引入了带有默认实现的方法,而且还添加了一个用JSR303验证规则注释的属性。问题是Spring Roo DataOnDemand逻辑没有看到这些字段,因此在getNewTransientObject()方法中没有考虑这些字段。

例如,以下(简化的)接口向实现“键控”接口的每个实体添加一个“键”字段:

import javax.persistence.Column;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public interface Keyed {

    public String getKey();

    public void setKey(String key);

    /**
     * AspectJ MixIn for any class which implements the interface. Provides a
     * default implementation using AspectJ. This is the style shown in
     * Manning's AspectJ in Action (2nd edition) for providing a default
     * implementation interface.
     * 
     * @author tgh
     */
    static aspect Impl {

        @NotNull
        @Column(name = "key", unique = true)
        @Size(min = 8, max = 12)
        private String Keyed.key;

        public void Keyed.setKey(String key) {
            this.key = key;
        }

        public String Keyed.getKey() {
            return this.key;
        }
    }
}

对我们来说,这实际上是一个解决了的问题。我们所做的是从Spring Roo创建的AspectJ ITD(.aj)文件中推入getNewTransientObject()方法,然后确保属性设置为可接受的值。在测试类的DataOnDemand.java文件中,我们有以下片段。

public KeyedExampleA getNewTransientKeyedExampleA(int index) {
    KeyedExampleA obj = new KeyedExampleA();
    setDescription(obj, index);
    setListPrice(obj, index);
    setName(obj, index);

    // Deal with mix-in variables that Roo doesn't know about
    obj.setKey("KEY_" + index);

    return obj;
}
让我感到不舒服的是,我们没有在DataOnDemand.java文件中创建setKey(obj,index)方法,也没有使用Spring Roo为getNewTransientKeyedObject(int)方法生成的样式。

是否值得费心为这样一个简单的情况创建setKey(obj,index)方法,还是我们应该继续在getNewTransientObject()方法中执行obj.setKey(value)
通过查看SpringRoo创建的.aj文件,我看不出它有多大区别,因为除了getNewTransientObject()方法之外,没有调用setField(obj,index)的方法。由于Spring Roo没有发现我们已经混合了引入的属性,它可能在将来也不会在意。

我将编写setKey()方法只是为了保持一致性。
但不这样做并不会造成任何问题。

我不确定你在问什么。您是否在问是否可以推入并修改SpringRoo生成的aspectJ文件?这更像是一个风格问题。在执行push-in之后,我们是否应该创建setKey(obj,index)方法呢?或者有没有更好的方法来处理SpringRoo没有正确创建getNewTransientObject()方法的问题?我会和你做的一样。恕我直言,我认为未来的Roo版本永远不会了解您所做的自定义AspectJ代码。它确实会导致问题的地方是,在开发阶段,它变成了另一个方法,每次您向类添加另一个常规属性时,都必须手动更新它。我很想写第二个方面,它为getNewTransientObject()方法提供建议,并将字段设置为可测试的值,而不必推入getNewTransientObject()。这样我就可以让SpringRoo来管理这个方法,但是我的混入需要更少的工作。我最终使用的解决方案是这样写的:是的,我不认为这是对的还是错的。创建一个方面来通知DataOnDemand类使问题变得更小,因为我们可以让Roo仍然构建自己的getNewTransientObject()方法,但随后建议它使用合适的值设置这些额外的成员。如图所示: