Java Spring Roo DataOnDemand和getNewTransientObject方法的定制?
在SpringRoo托管实体的集成测试中,我们在使用AspectJ混合风格接口时遇到了一个问题,该接口不仅引入了带有默认实现的方法,而且还添加了一个用JSR303验证规则注释的属性。问题是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
例如,以下(简化的)接口向实现“键控”接口的每个实体添加一个“键”字段:
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()方法,但随后建议它使用合适的值设置这些额外的成员。如图所示: