jax rs - NoInitialContextException in CXF Local Transport for testing the JAX-RS -
i following tutorial: https://cwiki.apache.org/confluence/display/cxf20doc/jaxrs+testing
but error:
javax.naming.noinitialcontextexception:need specify class name in environment or system property, or applet parameter, or in application resource file: java.naming.factory.initial
this local server class:
public class cxflocaltransporttestsuite { public static final logger logger = logmanager.getlogger(); public static final string endpoint_address = "local://service0"; private static server server; @beforeclass public static void initialize() throws exception { startserver(); } private static void startserver() throws exception { jaxrsserverfactorybean factory = new jaxrsserverfactorybean(); factory.setaddress(endpoint_address); list<class<?>> resourceclasses = new arraylist<class<?>>(); resourceclasses.add(communicationwsrestimpl.class); factory.setresourceclasses(resourceclasses); list<resourceprovider> resourceproviders = new arraylist<>(); resourceproviders.add(new singletonresourceprovider(new communicationwsrestimpl())); factory.setresourceproviders(resourceproviders); list<object> providers = new arraylist<object>(); providers.add(new jacksonjaxbjsonprovider()); providers.add(new apioriginfilter()); providers.add(new authenticationfilter()); providers.add(new authorizationfilter()); factory.setproviders(providers); server = factory.create(); server.start(); logger.info("local transport started"); } @afterclass public static void destroy() throws exception { server.stop(); server.destroy(); logger.info("local transport stopped"); } } and client example:
public class communicationapitest { // [public profile] // -------------------------------------------------------------------------------------------------------- @test public void getlinkedcomponentstest() { // path. param. // ******************************************************************************************************** string userid = "1"; string componentinstance = "a3449197-cc72-49eb-bc14-5d43a80dfa80"; string portid = "00"; // ******************************************************************************************************** webclient client = webclient.create(cxflocaltransporttestsuite.endpoint_address); client.path("/communication/getlinkedcomponents/{userid}-{componentinstance}-{portid}", userid, componentinstance, portid); client.header("authorization", "bearer " + cxflocaltransporttestsuite.authenticationtokenpublicprofile); response res = client.get(); if (null != res) { assertequals(statuscode.successful_operation.getstatuscode(), res.getstatus()); assertnotnull(res.getentity()); // valid response // ******************************************************************************************************** assertequals("> modules has not been initialized userid = 1", res.readentity(getlinksresult.class).getmessage()); // ******************************************************************************************************** } } } finally, jax-rs implementation on server side:
@path("/communication") public class communicationwsrestimpl implements communicationws { @path("/getlinkedcomponents/{userid}-{componentinstance}-{portid}") @get @produces(mediatype.application_json) public response getlinkedcomponents( @headerparam("authorization") string accesstoken, @pathparam("userid") string userid, @pathparam("componentinstance") string componentinstance, @pathparam("portid") string portid) { logger.info("[communicationwsrest - getlinkscomponents] userid: " + userid + " -- componentinstace: " + componentinstance + " -- portid: " + portid); getlinksresult result = new getlinksresult(); result.setgotten(false); result.setportlist(null); if (userid != null && userid.compareto("") != 0) { if (componentinstance != null && componentinstance.compareto("") != 0) { if (portid != null && portid.compareto("") != 0) { tmm tmm = null; javax.naming.context initialcontext; try { initialcontext = new initialcontext(); tmm = (tmm) initialcontext.lookup("java:app/cos/tmm"); result = tmm.calculateconnectedports(userid, componentinstance, portid); } catch (exception e) { logger.error(e); result.setmessage("> internal server error"); return response.status(status.internal_server_error).entity(result).build(); } } else { logger.error("not found or empty port error"); result.setmessage("> not found or empty port error"); return response.status(status.not_found).entity(result).build(); } } else { logger.error("not found or empty component instance error"); result.setmessage("> not found or empty component instance error"); return response.status(status.not_found).entity(result).build(); } } else { logger.error("not found or empty userid error"); result.setmessage("> not found or empty username error"); return response.status(status.not_found).entity(result).build(); } return response.ok(result).build(); } } maybe problem local transport not correctly configured launches exception because of lookup (see: server side):
tmm tmm = null; javax.naming.context initialcontext; try { initialcontext = new initialcontext(); tmm = (tmm) initialcontext.lookup("java:app/cos/tmm"); result = tmm.calculateconnectedports(userid, componentinstance, portid); } catch (exception e) { ..
the problem because running test in java se environment not configured jndi server. if run test part of war inside java ee app server, work fine.
so might need either run unit test inside app server or try mocking jndi server described here: http://en.newinstance.it/2009/03/27/mocking-jndi/#
hope helps, andy
Comments
Post a Comment