JAX-WS: использование аргумента в методе из другой аннотации класса - PullRequest
0 голосов
/ 21 марта 2012

Я создаю веб-сервис для работы.Я разбил его на 3 отдельных проекта Maven:

  • SOA (хранит объекты запросов и ответов, используемые в веб-методах)
  • Services (здесь хранятся классы, которые фактически выполняют обработку данных)
  • WebServices (здесь хранится интерфейс конечной точки и сгенерированная папка jaxws)

In SOA проект, у меня есть простой POJO, который используется для передачи необходимых значений в веб-метод

public class RequestObject {
    private String firstName = null;
    private String lastName = null;

    // Setters and Getters below...
}

Затем я пытаюсь сослаться на этот класс в WebServices проект.Я включаю сгенерированный JAR SOA в качестве зависимости в Maven.Это работает и правильно загружает файлы.

Интерфейс :

@WebService
public interface WebServiceInf {
    @WebMethod
    @WebResult(name="WebMethodResult")
    String createSomething(@WebParam(name="requestObject")RequestObject request);
}

Веб-служба :

import com.mine.data.RequestObject;

@WebServiceInterface(endpointInterface="com.mine.WebServiceInf")
public class WebServiceImpl implements WebServiceInf {
    @Override
    public String createSomething(RequestObject request) {
        return "I was created!";
    }
}

Проблема, с которой я сталкиваюсь, заключается в использовании инструмента wsgen .Это работает нормально, если я помещаю RequestObject внутри WebService проекта.Но как только я поместил этот класс в проект SOA , он выдает следующую ошибку:

Problem encountered during annotation processing; see stacktrace below for more information. java.lang.NullPointerException
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.isLegalType(WebServiceVisitor.java:770)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.isLegalParameter(WebServiceVisitor.java:670)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.isLegalMethod(WebServiceVisitor.java:637)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.methodsAreLegal(WebServiceVisitor.java:575)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.isLegalSEI(WebServiceVisitor.java:567)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.shouldProcessWebService(WebServiceVisitor.java:300)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.visitInterfaceDeclaration(WebServiceVisitor.java:94)
        at com.sun.tools.apt.mirror.declaration.InterfaceDeclarationImpl.accept(InterfaceDeclarationImpl.java:32)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.inspectEndpointInterface(WebServiceVisitor.java:395)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.visitClassDeclaration(WebServiceVisitor.java:128)
        at com.sun.tools.apt.mirror.declaration.ClassDeclarationImpl.accept(ClassDeclarationImpl.java:95)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.buildModel(WebServiceAP.java:315)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.process(WebServiceAP.java:256)
        at com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
        at com.sun.tools.apt.comp.Apt.main(Apt.java:454)
        at com.sun.tools.apt.main.JavaCompiler.compile(JavaCompiler.java:258)
        at com.sun.tools.apt.main.Main.compile(Main.java:1102)
        at com.sun.tools.apt.main.Main.compile(Main.java:964)
        at com.sun.tools.apt.Main.processing(Main.java:95)
        at com.sun.tools.apt.Main.process(Main.java:85)
        at com.sun.tools.apt.Main.process(Main.java:67)
        at com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.java:204)
        at com.sun.tools.internal.ws.wscompile.WsgenTool.run(WsgenTool.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105)
        at com.sun.tools.internal.ws.WsGen.main(WsGen.java:41) error: compilation failed, errors should have been reported

Так что, похоже, мне нужна определенная аннотация, чтобы сообщить WebService проект, который RequestObject находится в другом проекте / JAR.

Какую аннотацию я бы использовал для этого?Большое спасибо за помощь!

ОБНОВЛЕНИЕ

Вот как я звоню wsgen .Я выполняю эту команду из корневой папки WebServices

wsgen -keep -cp target/classes/ -s src/main/java -d target/classes/ com.mine.WebServiceImpl

1 Ответ

1 голос
/ 22 марта 2012

Ваш путь к классу указывает на цель / классы. Maven поместит все скомпилированные классы для текущего модуля в эту папку. Это объясняет, почему wsgen находит класс только тогда, когда он находится в локальном модуле. Существует jax-ws maven плагин , который установит classpath для вас. Это был бы самый простой подход на мой взгляд. По сути то, что вы хотите, это ...

wsgen -keep -cp target/classes:dependency1.jar:dependency2.jar:etc. -s src/main/java -d target/classes com.mine.WebServiceImpl
...