如何向JAXWS生成的源添加自定义代码

时间:2016-02-11 03:30:09

标签: java jax-ws wsdl2java

是否可以自定义JAXWS类的代码。我想要做的是为生成的类添加一些辅助方法,以帮助从中提取信息。我知道我可以将生成的源子类化,但这意味着我必须将它转换到我想要的信息。

是否有可能让jaxws(或其他工具)将生成的WSDL源代码与包含我的方法的一些自定义代码合并在一起? (在C#中,我可以使用部分类来完成此操作,但java似乎没有等效的...)

2 个答案:

答案 0 :(得分:4)

实现这一目标的一种方法是通过方面引入这些辅助方法。 AspectJ可能是这个的潜在候选人,或者如果你使用Spring,那么Spring AOP也可以做到这一点。

因此,使用AspectJ,您将利用名为"inter-type declaration"的功能,该功能允许您在现有类中引入新功能。如果生成的JAXWS类被称为MyTypeGen,那么您将使用方面(任意命名为MyTypeAspect)引入新方法,如下所示:

// generated class
class MyTypeGen  {      
    int x, y;

    public void setX(int x) { this.x = x; }
    public void setY(int y) { this.y = y; }
}

// introduce two new methods into MyTypeGen
aspect MyTypeAspect {
    public int MyTypeGen.multiply() {
        return x * y;
    }
    public int MyTypeGen.sum() {
        return x + y;
    }
}

在运行时,您可以调用那两个在构建时编织到MyTypeGen的新方法。不需要铸造。

MyTypeGen mytype = new MyTypeGen();
mytype.setX(3);
mytype.setY(4);
int product = mytype.multiply();
// product = 12

如果您决定使用Spring AOP,那么您将使用@Aspect注释创建一个普通的Java类,您可以在其中利用introductions功能。

答案 1 :(得分:1)

有很多方法可以做到这一点,其中一个使用方面已经被另一个答案提到了。

我想建议一个更轻松的替代方案,即扩展生成的类:

public GeneratedClass {

    public void doThis();

}

public ImprovedClass extends GeneratedClass {

    public void doExtraStuff();

}

这样做的好处是您可以清楚地定义GeneratedClass可以做到的事情。如果您开始将方法编织到GeneratedClass中,那么几年后处理该项目的人可能会认为所生成的类的所有类似实例都具有相同的方法。或者他们可能会混淆为什么一些生成的类有这些额外的方法,而有些则没有。额外的功能应保存在明确定义的类中。只有该类型的子类可以执行额外的操作。这清楚地说明了该方法的来源。

这并不像我有代码编织的东西,但我认为代码编织应该只用于不涉及业务逻辑的东西,如日志,指标或框架内部。不应将与业务逻辑相关的代码编织到类中。

无论如何,另一种方法是封装类,但这需要一个接口。

public GeneratedClass implements SomeInterface {

    public void doThis();

}

public ImprovedClass implements SomeInterface {

    public SomeInterface impl;

    public Improvedclass(SomeInterface impl) {
        this.impl = impl;
    }

    public void doThis() {
        this.impl.doThis();
    }

    public void doExtraStuff() {
        // the extra stuff
    }

}