JAX-WS and CDI not working together on WAS Liberty Profile 8.5.5.6

拜拜、爱过 提交于 2019-12-11 12:03:14

问题


I am experiencing strange behavior when I attempt to combine a JAX-WS web service endpoint class and a simple CDI injection. When I try to inject the object into the WebService implementation class, the injected object's PostConstruct method is never called. Indeed the classes constructor is not called either.

Here is my JAX-WS implementation class and the injection point:

@WebService(serviceName="eNC3BusinessWebService")
public class eNC3BusinessWebServiceImpl
{

    @WebMethod
    public SubmissionValidationResults xmlValidation(String xml, String submissionType, String schemaVersion)
            throws SOAPException
    {          
        // Validate schema
        SubmissionValidationResults results = fileSubmissionServiceHandler.validateXML(xml, submissionType,
                schemaVersion);

        return results;
    }

    @Inject
    private FileSubmissionServiceHandler fileSubmissionServiceHandler;

    @Inject
    private BRSubmissionService brSubmissionService;
}

And here is my injected class, the FileSubmissionServiceHandler:

public class FileSubmissionServiceHandler
{
    public FileSubmissionServiceHandler()
    {
        System.out.println("Constructor being called on FileSubmissionServiceHandler");
    }

    @PostConstruct
    public void init()
    {
        final String webserviceURL = "https://hostname/FileSubmissionService/FileSubmissionService.svc";
        final String username = "username";
        final String password = "password";

        this.webservice = new BasicHttpsBinding_IFileSubmissionServiceProxy(username, password);
        Descriptor desc = webservice._getDescriptor();
        desc.setEndpoint(webserviceURL);
    }

    public SubmissionValidationResults validateXML(String xml, String submissionType,
            String schemaVersion) throws WebServiceException
    {
        SubmissionValidationResults results = null;
        FormType type = FormType.getByName(submissionType);
        String submissionTypeCode = type.getCode();

        try
        {
            results = this.webservice.validateXmlFile(xml, submissionTypeCode, schemaVersion);

        }
        catch (Exception e)
        {
            logger.error("Internal FileSubmissionService threw an exception", e);
            throw e;
        }

        return convertSubmissionValidationResults(results);
    }

    private BasicHttpsBinding_IFileSubmissionServiceProxy webservice;
}

I was asked to post my server XML (overriding port settings due to two copies of the Liberty profile running at one time):

<server description="new server">

<!-- Enable features -->
<featureManager>
    <feature>jaxws-2.2</feature>
    <feature>servlet-3.1</feature>
    <feature>cdi-1.2</feature>
</featureManager>

<!--For a user registry configuration, configure your user registry. For 
    example, configure a basic user registry using the basicRegistry element. 
    Specify your own user name below in the name attribute of the user element. 
    For the password, generate an encoded password using bin/securityUtility 
    encode and add it in the password attribute of the user element. Then uncomment 
    the user element. -->
<basicRegistry id="basic" realm="BasicRealm">
    <user name="wasadmin" password="{xor}KD4sPjsyNjE=" />
</basicRegistry>

<keyStore password="{xor}KD4sPjsyNjE=" />

<!-- To access this server from a remote client add a host attribute to 
    the following element, e.g. host="*" -->
<httpEndpoint host="*" httpPort="9090" httpsPort="9445"
    id="defaultHttpEndpoint" />

<wasJmsEndpoint wasJmsPort="7277" wasJmsSSLPort="7287" />

<iiopEndpoint host="localhost" id="defaultIiopEndpoint"
    iiopPort="2814">
    <iiopsOptions iiopsPort="2815" />
</iiopEndpoint>

<applicationMonitor updateTrigger="mbean" />

<enterpriseApplication id="eNC3BusinessWebService_EAR"
    location="eNC3BusinessWebService_EAR.ear" name="eNC3BusinessWebService_EAR" />

And Logs:

Launching defaultServer (WebSphere Application Server 8.5.5.6/wlp-1.0.9.cl50620150610-1749) on Java HotSpot(TM) 64-Bit Server VM, version 1.7.0_79-b15 (en_US)
[AUDIT   ] CWWKE0001I: The server defaultServer has been launched.
[AUDIT   ] CWWKE0100I: This product is licensed for development, and limited production use. The full license terms can be viewed here: https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/license/base_ilan/ilan/8.5.5.6/lafiles/en.html
[AUDIT   ] CWWKZ0058I: Monitoring dropins for applications. 
[WARNING ] CWNEN0047W: Resource annotations on the fields of the xxx.important.not.external.service.eNC3BusinessWebServiceImpl class will be ignored. The annotations could not be obtained because of the exception : java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware
[AUDIT   ] CWWKT0016I: Web application available (default_host): http://localhost:9090/eNC3BusinessWebService/
[AUDIT   ] CWWKZ0001I: Application eNC3BusinessWebService_EAR started in 3.011 seconds.
[AUDIT   ] CWWKF0012I: The server installed the following features: [jaxws-2.2, cdi-1.2, servlet-3.1, jndi-1.0, javaMail-1.5, jaxb-2.2].
[AUDIT   ] CWWKF0011I: The server defaultServer is ready to run a smarter planet.
20-01-2016 - 10:02:47 - INFO  (eNC3BusinessWebServiceImpl.java:31) - --- Validating Incomming Form XML ---
20-01-2016 - 10:02:47 - INFO  (eNC3BusinessWebServiceImpl.java:33) - Received Payload: XML [Hello]
20-01-2016 - 10:02:47 - INFO  (eNC3BusinessWebServiceImpl.java:34) - SubmissionType [from the]
20-01-2016 - 10:02:47 - INFO  (eNC3BusinessWebServiceImpl.java:35) - SchemaVersion [other side]
[WARNING ] Application {http://service.external.not.important.xxx/}eNC3BusinessWebService#{http://service.external.not.important.xxx/}xmlValidation has thrown exception, unwinding now
java.lang.NullPointerException

I have redacted some of the less relevant details of each class, but the basic operations are the same. When I attempt to access the "validateXML" method of the fileSubmissionServiceHandler object, a null pointer exception is thrown, and I never see the output from the postConstruct or constructor methods in my FileSubmissionServiceHandler class. Using the debugger, these methods are never reached.

Things I have checked so far:

  1. I have an empty beans.xml file in my WEB-INF folder
  2. I am including the javaee-7.0 feature in the server.xml which includes jax-ws and cdi
  3. I also tried adding both application scope and request scope to the FileSubmissionServiceHandler with no effect.

Does anyone have any ideas why this would not work?


回答1:


It looks like the injection was not performed for some reason. As a consequence, the constructor and PostConstruct were not being invoked and then you hit the NPE. Can attach your application so that I can take a further look?




回答2:


Since you didn't paste the log, nor the configure file,server.xml etc. I tried to produce the problem on 8.5.5.6, but I find I can do injection and call post constructor method.

My test case is similar with yours. The only difference is I'm not using javaee-7.0 feature due to it requires more configuration in server.xml but just include features below:

jaxws-2.2, servlet-3.1,cdi-1.2

Please have a try.

If it still doesn't work, please make sure that without injection, it can work correctly. You'd better paste the log and the full server.xml as these important to problem determination.




回答3:


Ok, I've finally isolated the cause of the problem.

The object called BRSubmissionService is being loaded by CDI. CDI loading is being interrupted by the spring exception. And because CDI is not able to complete, the remaining CDI injections do not occur and my FileSubmissionService object is not loaded, causing my null pointer exception.

The solution is to fix the spring error inside the BRSubmissionService object which is located in another jar, that unfortunately I've inherited from another developer. Such is the life.



来源:https://stackoverflow.com/questions/34074041/jax-ws-and-cdi-not-working-together-on-was-liberty-profile-8-5-5-6

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!