【问题标题】:Customization of Spring Roo DataOnDemand getNewTransientObject method?Spring Roo DataOnDemand getNewTransientObject 方法的自定义?
【发布时间】:2012-10-30 08:22:31
【问题描述】:

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

例如,以下(简单的)接口为每个实现“Keyed”接口的实体添加了一个“key”字段:

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) 方法?

通过查看 Spring Roo 创建的 .aj 文件,我看不出它有什么不同,因为除了 getNewTransientObject() 方法之外,没有任何东西可以调用 setField(obj,index) 。而且由于 Spring Roo 并没有弄清楚我们是否引入了 mix-in 属性,所以它将来可能也不会关心。

【问题讨论】:

  • 我不确定你在这里问什么。是问是否可以推入修改spring roo生成的aspectJ文件?
  • 这更像是一个风格问题。在完成推入之后,我们是否应该费心创建 setKey(obj,index) 方法?或者有没有更好的方法来处理 Spring Roo 没有正确创建 getNewTransientObject() 方法的问题?
  • 我会和你做的一样。恕我直言,我认为未来的 Roo 版本永远不会了解您所做的自定义 AspectJ 代码。
  • 它确实引起问题的地方在于,在开发阶段,它变成了一种方法,每次您向类添加另一个常规属性时都必须手动更新。我很想编写第二个 Aspect,它建议 getNewTransientObject() 方法并将字段设置为可测试的值,而不必推入 getNewTransientObject()。这样我可以让 Spring Roo 管理该方法,但我的 mixin 将需要更少的工作。
  • 我最终使用的解决方案是将该方面编写如下:stackoverflow.com/questions/13370167/…

标签: java integration-testing spring-roo


【解决方案1】:

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

【讨论】:

  • 是的,我认为这没有对错之分。创建一个方面来通知 DataOnDemand 类使问题变得更小,因为我们可以让 Roo 仍然构建它自己的 getNewTransientObject() 方法,然后建议它为这些附加成员设置合适的值。如图所示:stackoverflow.com/questions/13370167/…
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多