I have a little problem with my web service. I exposed my EJB as a web service with annotations.
My other web services are working but this web service doesn't work.
In the method I need to do some transactions.
Here is my EJB exposed as web service:
#Stateless
#WebService( endpointInterface="blabla.PfmOverview",serviceName="PfmOverviewWS",name="PfmOverviewWS" )
#XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class)
public class PfmOverviewBean implements PfmOverview
{
SessionContext sessionContext;
public void setSessionContext(SessionContext sessionContext)
{
this.sessionContext = sessionContext;
}
public PfmOverviewDto getPfmOverview( YUserProfile userProfile, BigDecimal portfolioId,#XmlJavaTypeAdapter(value=DateAdapter.class, type=Date.class) Date computeDate ) throws Exception
{
YServerCtx serverCtx = new YServerCtx( userProfile );
UserTransaction ut = null;
try
{
ut = sessionContext.getUserTransaction( );
ut.begin( );
PfmOverviewDto dto = new PfmOverviewBL( serverCtx ).getPfmOverviewDataPf( portfolioId, computeDate );
ut.rollback( );
return dto;
}
catch( Throwable t )
{
if( ut != null )
ut.rollback( );
SLog.error( t );
throw ( t instanceof Exception ) ? (Exception) t : new Exception( t );
}
finally
{
serverCtx.disconnect( );
}
}
When I call my web service in the client side (generated automatically with ws import), I get a NullPointerException at this line:
ut = sessionContext.getUserTransaction( );
Do I add annotations for the UserTransaction or anything else?
I am working on Eclipse and Jboss 6.2 as 7.
By default the transaction type of the session beans is CMT, which means that the Container is the only one that can manage the transaction. The getUserTransaction() method can only be invoked from a bean with Bean-Managed Transaction.
Keep in mind that the getPfmOverview() business method already executes in a transaction created by the Container.
If you really need manage the transaction programmatically, you can change the bean transaction type with the #TransactionManagement annotation.
I solved this problem.
In fact I kept the #Resource and #TransactionManagement annotations.
I changed my SessionContext into EJBContext and I also changed my setSessionContext like this:
EJBContext sessionContext;
...
#Resource
private void setSessionContext( EJBContext sctx )
{
this.sessionContext = sctx;
}
And in my method, to get the userTransaction I do:
UserTransaction ut = null;
try
{
ut = sessionContext.getUserTransaction( );
ut.begin( );
//here I'm calling DB access etc: result = blabla....
ut.rollback( );
return result;
}
catch( Throwable t )
{
if( ut != null )
ut.rollback( );
SLog.error( t );
throw ( t instanceof Exception ) ? (Exception) t : new Exception( t );
}
Related
When I try to test a spring cloud stream function based method, it always happens NullPointerException about InputDestination.
I have two questions:
It's hard for me to know how to write UT from the official doc. official test doc
Besides, how to write integration Test if test file has some dependencies. It seems create a new context and always has NoSuchBeanDefination error.
I have tried as flow, but the context can not find some dependency beans.
#Test
public void sampleTest() {
try (ConfigurableApplicationContext context = new SpringApplicationBuilder(
TestChannelBinderConfiguration.getCompleteConfiguration(
MyTestConfiguration.class))
.run("--spring.cloud.function.definition=uppercase")) {
InputDestination source = context.getBean(InputDestination.class);
OutputDestination target = context.getBean(OutputDestination.class);
source.send(new GenericMessage<byte[]>("hello".getBytes()));
assertThat(target.receive().getPayload()).isEqualTo("HELLO".getBytes());
}
}
So I just want to write UT, but still have NPE.
Here is my code.
#Bean
public Function<Message<List<DemoBean>>, Message<DemoBean>> findFirstBean( ){
return message -> {
List<DemoBean> demoBeans = message.getPayload();
return MessageBuilder.withPayload(demoBeans.get( 0 )).build();
};
}
Here is my test.
#SpringBootTest
#ActiveProfiles(profiles = "local")
#Import({ TestChannelBinderConfiguration.class})
class FunctionDemoTest {
#Autowired
private InputDestination inputDestination;
#Autowired
private OutputDestination outputDestination;
private FunctionDemo functionDemo;
// some dependency need to mock
private DemoService demoService;
#BeforeEach
void setUp() {
demoService = Mockito.mock( DemoService.class );
functionDemo = new FunctionDemo( demoService);
}
#Test
public void findFirstBeanTest() {
DemoBean demoBean = new DemoBean();
demoBean.setName("Howard");
demoBean.setAge( 1 );
DemoBean demoBean1 = new DemoBean();
demoBean1.setName("Frank");
demoBean1.setAge( 2 );
List<DemoBean> demoBeanList = new ArrayList<>();
demoBeanList.add( demoBean );
demoBeanList.add( demoBean1 );
Message<List<DemoBean>> inputMessage = MessageBuilder.withPayload(demoBeanList).build();
inputDestination.send(inputMessage,"findFirstBean-in-0");
Assertions.assertNotNull( outputDestination.receive( 10000, "findFirstBean-out-0") );
}
}
Here is error:
java.lang.NullPointerException: while trying to invoke the method org.springframework.messaging.SubscribableChannel.send(org.springframework.messaging.Message) of a null object returned from org.springframework.cloud.stream.binder.test.InputDestination.getChannelByName(java.lang.String)
at org.springframework.cloud.stream.binder.test.InputDestination.send(InputDestination.java:89)
at com.successfactors.caf.listener.FunctionDemoTest.raePdrResultProcessor(FunctionDemoTest.java:82)
Well, I know the root cause of NPE.
Message<byte[]> receive(long timeout, String bindingName)
It seems should be destinationName instead of bindingName in source code.
Any other answers would be appreciated.
I have created a class and published it as web service. I have created a web method like this:
public void addNewRow(MyObject cob) {
MyAppModule myAppModule = new MyAppModule();
try {
ViewObjectImpl vo = myAppModule.getMyVewObject1();
================> vo object is now null
Row r = vo.createRow();
r.setAttribute("Param1", cob.getParam1());
r.setAttribute("Param2", cob.getParam2());
vo.executeQuery();
getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}
As I have written in code, myAppModule.getMyVewObject1() returns a null object. I do not understand why! As far as I know AppModule has to initialize the object by itself when I call "getMyVewObject1()" but maybe I am wrong, or maybe this is not the way it should be for web methods. Has anyone ever faced this issue? Any help would be very appreciated.
You can check nice tutorial: Building and Using Web Services with JDeveloper
It gives you general idea about how you should build your webservices with ADF.
Another approach is when you need to call existing Application Module from some bean that doesn't have needed environment (servlet, etc), then you can initialize it like this:
String appModuleName = "org.my.package.name.model.AppModule";
String appModuleConfig = "AppModuleLocal";
ApplicationModule am = Configuration.createRootApplicationModule(appModuleName, appModuleConfig);
Don't forget to release it:
Configuration.releaseRootApplicationModule(am, true);
And why you shouldn't really do it like this.
And even more...
Better aproach is to get access to binding layer and do call from there.
Here is a nice article.
Per Our PM : If you don't use it in the context of an ADF application then the following code should be used (sample code is from a project I am involved in). Note the release of the AM at the end of the request
#WebService(serviceName = "LightViewerSoapService")
public class LightViewerSoapService {
private final String amDef = " oracle.demo.lightbox.model.viewer.soap.services.LightBoxViewerService";
private final String config = "LightBoxViewerServiceLocal";
LightBoxViewerServiceImpl service;
public LightViewerSoapService() {
super();
}
#WebMethod
public List<Presentations> getAllUserPresentations(#WebParam(name = "userId") Long userId){
ArrayList<Presentations> al = new ArrayList<Presentations>();
service = (LightBoxViewerServiceImpl)getApplicationModule(amDef,config);
ViewObject vo = service.findViewObject("UserOwnedPresentations");
VariableValueManager vm = vo.ensureVariableManager();
vm.setVariableValue("userIdVariable", userId.toString());
vo.applyViewCriteria(vo.getViewCriteriaManager().getViewCriteria("byUserIdViewCriteria"));
Row rw = vo.first();
if(rw != null){
Presentations p = createPresentationFromRow(rw);
al.add(p);
while(vo.hasNext()){
rw = vo.next();
p = createPresentationFromRow(rw);
al.add(p);
}
}
releaseAm((ApplicationModule)service);
return al;
}
Have a look here too:
http://www.youtube.com/watch?v=jDBd3JuroMQ
I'm trying to register to a CORBA CosNotification Service. In the documentation of the service I'm trying to connect to, it says I have to a CosNotifyComm::SequencePushConsumer object, and attach it to the notification service. I've included my code, and the error I'm getting back.
AlarmClient.java
import NotificationIRPSystem.*;
import org.omg.CosNotification.*;
import org.omg.CosNotifyComm.*;
import org.omg.CosNotifyChannelAdmin.*;
import org.omg.CosNotifyFilter.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.PortableServer.*;
public class AlarmClient
{
static _NotificationIRPOperations notiOp;
public static void main (String args [])
{
try{
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, null);
org.omg.CORBA.Object objRef =
orb.resolve_initial_references ("NameService");
System.out.println("IOR===> " + objRef);
NamingContextExt nc = NamingContextExtHelper.narrow(objRef);
String name = "com/ericsson/nms/cif/service/NMSNAConsumer";
String portal = "com/ericsson/nms/cif/service/NMSNAPortal";
org.omg.CORBA.Object notiObj = nc.resolve_str(name);
System.out.println(nc.resolve_str(portal));
System.out.println("noti---->" + notiObj);
_NotificationIRPOperations tt = _NotificationIRPOperationsHelper.narrow(notiObj);
IRPManager irpMan = new IRPManager();
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
org.omg.CORBA.Object objNotiServer = poa.servant_to_reference(irpMan);
String manager_reference = orb.object_to_string(objNotiServer);
System.out.println("MANAGER REF: " + manager_reference);
System.out.println("OBJ NOTI SERVER: " + objNotiServer);
int time_tick = 15;
String filter = "";
String[] asd = {};
NotificationIRPConstDefs.EventTypesSetHolder e_list = new NotificationIRPConstDefs.EventTypesSetHolder();
NotificationIRPConstDefs.ExtendedEventTypesSetHolder ex_list = new NotificationIRPConstDefs.ExtendedEventTypesSet\
Holder();
String cats[] = tt.get_notification_categories(e_list, ex_list);
String res = tt.attach_push(manager_reference, time_tick, asd , filter);
// System.out.println("SUCCESS--->" + res);
// String[] ids = tt.get_subscription_ids(manager_reference);
System.out.println("ALARMIRPOPERATIONS_----> " + tt);
} catch (Exception e){
System.out.println ("ERROR: " + e);
e.printStackTrace (System.out);
}
}
}
IRPManager.java
import NotificationIRPSystem.*;
import org.omg.CosNotification.*;
import org.omg.CosNotifyComm.*;
import org.omg.CosNotifyChannelAdmin.*;
import org.omg.CosNotifyFilter.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.PortableServer.*;
public class IRPManager
extends SequencePushConsumerPOA
{
public void disconnect_sequence_push_consumer()
{
System.out.println("Disconnected!");
}
public void push_structured_events(org.omg.CosNotification.StructuredEvent[] notifications) throws org.omg.CosEvent\
Comm.Disconnected
{
System.out.println("Received Event");
}
public void offer_change(org.omg.CosNotification.EventType[] added, org.omg.CosNotification.EventType[] removed) th\
rows org.omg.CosNotifyComm.InvalidEventType
{
System.out.println("Offer Change!");
}
}
OUTPUT
14-Aug-2013 3:54:02 PM org.jacorb.orb.ORBSingleton <init>
INFO: created ORBSingleton
IOR===> IOR:000000000000001D49444C3A6F6D672E6F72672F434F5242412F4F626A6563743A312E3000000000000000010000000000000040000102000000000F3137322E33302E3132302E3135380000C06600000000000B4E616D655365727669636500000000010000000000000008000000004A414300
14-Aug-2013 3:54:03 PM org.jacorb.orb.giop.ClientConnectionManager getConnection
INFO: ClientConnectionManager: created new ClientGIOPConnection to 172.30.120.158:49254 (7bea5671)
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection connect
INFO: Connected to 172.30.120.158:49254 from local port 57080
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection close
INFO: Client-side TCP transport to 172.30.120.158:49254 closed.
14-Aug-2013 3:54:03 PM org.jacorb.orb.giop.ClientConnectionManager getConnection
INFO: ClientConnectionManager: created new ClientGIOPConnection to 10.20.0.4:49254 (58a17083)
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection connect
INFO: Connected to 10.20.0.4:49254 from local port 52574
IOR:000000000000001849444C3A506F7274616C2F53657276696365733A312E300000000001000000000000007C000102000000000A31302E32302E302E3800C27B0000002000504D43000000040000000C2F466163746F7279504F4100000000040000000000000003564953030000000500070801FF000000000000000000000800000000564953000000000100000018000000000001000100000001050100010001010900000000
noti---->IOR:000000000000004449444C3A336770707361352E6F72672F4E6F74696669636174696F6E49525053797374656D2F4E6F74696669636174696F6E4952504F7065726174696F6E733A312E3000000000010000000000000088000102000000000A31302E32302E302E3800C27B0000002C00504D43000000040000000C2F466163746F7279504F4100000000104E4D534E41436F6E73756D6572322E3300000003564953030000000500070801FF000000000000000000000800000000564953000000000100000018000000000001000100000001050100010001010900000000
14-Aug-2013 3:54:03 PM org.jacorb.poa.AOM add
INFO: oid: 00 40 46 20 4B 4D 29 05 2A 07 10 06 30 46 38 14 14 1B 48 4C .#F KM).*...0F8...HL1B .object is activated
14-Aug-2013 3:54:03 PM org.jacorb.poa.POA getImplName
INFO: Using server ID (8624227886) for transient POA
MANAGER REF: IOR:000000000000003349444C3A6F6D672E6F72672F436F734E6F74696679436F6D6D2F53657175656E636550757368436F6E73756D65723A312E300000000000010000000000000050000102000000000E3137322E31362E32342E31353200B91900000020383632343232373838362F004046204B4D29052A07100630463814141B484C1B000000010000000000000008000000004A414300
OBJ NOTI SERVER: IOR:000000000000003349444C3A6F6D672E6F72672F436F734E6F74696679436F6D6D2F53657175656E636550757368436F6E73756D65723A312E300000000000010000000000000050000102000000000E3137322E31362E32342E31353200B91900000020383632343232373838362F004046204B4D29052A07100630463814141B484C1B000000010000000000000008000000004A414300
14-Aug-2013 3:54:03 PM org.jacorb.orb.giop.ClientConnectionManager getConnection
INFO: ClientConnectionManager: created new ClientGIOPConnection to 10.20.0.8:49787 (68e6ff0d)
14-Aug-2013 3:54:03 PM org.jacorb.orb.iiop.ClientIIOPConnection connect
INFO: Connected to 10.20.0.8:49787 from local port 35910
**************************************************************************org.jacorb.orb.giop.RequestOutputStream#1be1a408
14-Aug-2013 3:54:04 PM org.jacorb.orb.iiop.ClientIIOPConnection close
INFO: Client-side TCP transport to 10.20.0.8:49787 closed.
org.omg.CORBA.MARSHAL: Server-side Exception: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.jacorb.orb.SystemExceptionHelper.read(SystemExceptionHelper.java:222)
at org.jacorb.orb.ReplyReceiver.getReply(ReplyReceiver.java:456)
at org.jacorb.orb.Delegate._invoke_internal(Delegate.java:1418)
at org.jacorb.orb.Delegate.invoke_internal(Delegate.java:1187)
at org.jacorb.orb.Delegate.invoke(Delegate.java:1175)
at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:80)
at NotificationIRPSystem.__NotificationIRPOperationsStub.attach_push(__NotificationIRPOperationsStub.java:288)
at AlarmClient.main(AlarmClient.java:43)
I'm not really sure what's happening. I think maybe that the object I'm trying to marshal is different from what the server expects? I hope someone can help, let me know if you need more information or if I missed something.
UPDATE
This is the _NotificationIRPOperationsStub code which contains attach_push
public java.lang.String attach_push(java.lang.String manager_reference, int time_tick, java.lang.String[] notification_category_set, java.lang.String filter) throws NotificationIRPSystem.AlreadySubscribed,NotificationIRPSystem.Attach,NotificationIRPSystem.AtLeast\
OneNotificationCategoryNotSupported,NotificationIRPSystem.ParameterNotSupported,NotificationIRPSystem.InvalidParameter
{
while(true)
{
if(! this._is_local())
{
org.omg.CORBA.portable.InputStream _is = null;
org.omg.CORBA.portable.OutputStream _os = null;
try
{
_os = _request( "attach_push", true);
java.lang.String tmpResult10 = manager_reference;
_os.write_string( tmpResult10 );
_os.write_ulong(time_tick);
NotificationIRPConstDefs.NotificationCategorySetHelper.write(_os,notification_category_set);
java.lang.String tmpResult11 = filter;
_os.write_string( tmpResult11 );
System.out.println("**************************************************************************" + _os.toString());
_is = _invoke(_os);
java.lang.String _result = _is.read_string();
return _result;
}
catch( org.omg.CORBA.MARSHAL m){
m.printStackTrace();
return m.getStackTrace().getClassName();
}
catch( org.omg.CORBA.portable.RemarshalException _rx )
{
continue;
}
catch( org.omg.CORBA.portable.ApplicationException _ax )
{
String _id = _ax.getId();
try
{
if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/AlreadySubscribed:1.0"))
{
throw NotificationIRPSystem.AlreadySubscribedHelper.read(_ax.getInputStream());
}
else
if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/Attach:1.0"))
{
throw NotificationIRPSystem.AttachHelper.read(_ax.getInputStream());
}
else
if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/AtLeastOneNotificationCategoryNotSupported:1.0"))
{
throw NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupportedHelper.read(_ax.getInputStream());
}
else
if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/ParameterNotSupported:1.0"))
{
throw NotificationIRPSystem.ParameterNotSupportedHelper.read(_ax.getInputStream());
}
else
if( _id.equals("IDL:3gppsa5.org/NotificationIRPSystem/InvalidParameter:1.0"))
{
throw NotificationIRPSystem.InvalidParameterHelper.read(_ax.getInputStream());
}
else{
throw new RuntimeException("Unexpected exception " + _id );
}
}
finally
{
try
{
_ax.getInputStream().close();
}
catch (java.io.IOException e)
{
throw new RuntimeException("Unexpected exception " + e.toString() );
}
}
}
finally
{
if (_os != null)
{
try
{
_os.close();
}
catch (java.io.IOException e)
{
throw new RuntimeException("Unexpected exception " + e.toString() );
}
}
this._releaseReply(_is);
}
}
else
{
org.omg.CORBA.portable.ServantObject _so = _servant_preinvoke( "attach_push", _opsClass );
if( _so == null )
continue;
_NotificationIRPOperationsOperations _localServant = (_NotificationIRPOperationsOperations)_so.servant;
java.lang.String _result;
try
{
_result = _localServant.attach_push(manager_reference,time_tick,notification_category_set,filter);
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).normalCompletion();
return _result;
}
catch (NotificationIRPSystem.AlreadySubscribed ex)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
throw ex;
}
catch (NotificationIRPSystem.Attach ex)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
throw ex;
}
catch (NotificationIRPSystem.AtLeastOneNotificationCategoryNotSupported ex)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
throw ex;
}
catch (NotificationIRPSystem.ParameterNotSupported ex)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
throw ex;
}
catch (NotificationIRPSystem.InvalidParameter ex)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);
throw ex;
}
catch (RuntimeException re)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(re);
throw re;
}
catch (java.lang.Error err)
{
if ( _so instanceof org.omg.CORBA.portable.ServantObjectExt)
((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(err);
throw err;
}
finally
{
_servant_postinvoke(_so);
}
}
}
}
Thanks.
UPDATE # 2
Thanks to Brian for posting that version of the document. I took the IDL from there, and with a minor adjustment I was able to call attach_push with my objNotiServer. My next question is about how I can set my AlarmClient up to receive these notifications. My assumption is that I can call orb.run() and then when notifications come in, I will receive them in my IRPManager object, is that right?
CORBA::MARSHAL exceptions usually occur because of one of these reasons:
IDL mismatches between client and server (causing unexpected payload differences)
Crappy ORB products that don't know how to unmarshal complex but valid payloads correctly
Reason #2 is really unlikely nowadays, as ORBs have matured enough that this rarely happens. As long as you're using ORB products on both the client and server side that were built in this century then you're probably ok. That leaves reason #1.
The IDL for the method you're calling is (I believe) from this document, and looks like this:
interface NotificationIRPOperations {
NotificationIRPConstDefs::SubscriptionId attach_push (
in Object manager_reference,
in long time_tick,
in NotificationCategorySet notification_category_set,
in string filter
)
raises (Attach, ParameterNotSupported, InvalidParameter, AlreadySubscribed,
AtLeastOneNotificationCategoryNotSupported);
Note the first parameter, it's of type Object. However in your code, you're passing a string. However the IDL type Object maps to org.omg.CORBA.Object in Java, not to a String. I would have expected to see you pass objNotiServer instead for this parameter.
So either your IDL is mismatched with what your server is expecting (likely), or your IDL compiler isn't following the basic IDL-to-Java mapping rules (unlikely).
Either way, something smells bad there. I don't believe that the ORB will implicitly call ORB.string_to_object() for you, so that would lead to a regular string being sent on the network when the server is actually expecting a stringified Object reference. The difference is subtle but it might be the reason why the server is throwing a MARSHAL back at you.
So your first port of call should be a check on the IDL file that you're using to build your client. Make sure that you've got the exact and correct IDL for the server you're trying to call. If there's any mismatch at all then MARSHAL exceptions will happen, and happen a lot.
The server side has a problem, therefor you receive the server side exception.
Your IDL is different on Server/Client which causes this error.
You have to look at the server's logfile. If you do not have access to the server, implement your own dummy-server and find out whether or not it works.
Regarding the manager_reference, test it in your own code via: narrow and a call to _non_existent(). I.e.
org.omg.CORBA.Object managerObj = orb.string_to_object(manager_reference);
IRPManager managerImpl = IRPManagerHelper.narrow(managerObj);
managerImpl._non_existent()
If this works, your IRPManager servant works.
By the way, you have a lot of unused imports and should refactor them. Your IDE would help you.
For Update2
Yout Alarmclient has to implement StructuredPushConsumer (see Initializing Corba notification service in java successfully but cannot get any events in linux but it's done in windows) and subscribe to the notifications.
But I recomment to open a new question.
Your code looks suspicious, you never activate irpMan in the POA, but you do use servant_to_reference. Try the code below, handle it as pseudo code, I haven't tested it and I normally program C++.
IRPManager irpMan = new IRPManager();
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
ObjectId id = poa.activate_object (irpMan);
org.omg.CORBA.Object objNotiServer = poa.id_to_reference(id);
String manager_reference = orb.object_to_string(objNotiServer);
System.out.println("MANAGER REF: " + manager_reference);
System.out.println("OBJ NOTI SERVER: " + objNotiServer);
int time_tick = 15;
String filter = "";
String[] asd = {};
NotificationIRPConstDefs.EventTypesSetHolder e_list = new NotificationIRPConstDefs.EventTypesSetHolder();
NotificationIRPConstDefs.ExtendedEventTypesSetHolder ex_list = new NotificationIRPConstDefs.ExtendedEventTypesSet\
Holder();
String cats[] = tt.get_notification_categories(e_list, ex_list);
String res = tt.attach_push(objNotiServer, time_tick, asd , filter);
I have created a restful web service on netbeans that accesses a local database.
I have looked at a sample project from netbeans and they use a JPA controller.
This question may be basic, but I don't have alotted time to investigate very deeply on JPAs.
Can someone explain why the use of JPA controllers is necessary?
Also, I read this previous question,"Database table access via JPA Vs. EJB in a Web-Application" and it advises to use an EJB.
Again, can this be explained.
public class CustomerJpaController implements Serializable {
public CustomerJpaController(UserTransaction utx, EntityManagerFactory emf) {
this.utx = utx;
this.emf = emf;
}
private UserTransaction utx = null;
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public void create(Customer customer) throws PreexistingEntityException, RollbackFailureException, Exception {
EntityManager em = null;
try {
utx.begin();
em = getEntityManager();
em.persist(customer);
utx.commit();
} catch (Exception ex) {
try {
utx.rollback();
} catch (Exception re) {
throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
}
if (findCustomer(customer.getCustomerId()) != null) {
throw new PreexistingEntityException("Customer " + customer + " already exists.", ex);
}
throw ex;
} finally {
if (em != null) {
em.close();
}
}
}
I've never heard of a "JPA controller", but one typically embeds JPA code within some kind of Service class in order to handle transactions.
Stateless EJB beans are perfectly suited for this. Without them you'd have to start, commit and rollback a transaction manually, which is tedious, verbose and error prone. With EJB this becomes trivial as they transparently manage transactions for you.
There are two accounts on my windows pc: \A1 and \SYSTEM. My test project consists of three applications:
Server.exe - out-of-proc com server. implements object Q
Service.exe - out-of proc com service. implements object T
Client.exe - a client applications
My workflow is shown below:
I logged in the \A1. I launch 'Client.exe'.
Client creates an instance of the object 'T'
Client calls some method, say 'T.ActivateQ', which instantiates 'Q'.
My intention is to make Service.exe to create an instance of 'Q' in the account \A1, even though Service.exe resides under the \SYSTEM account.
As stated in this article, Windows has built in functionality to do this kind of activation called 'Session-to-Session activation'. It is implemented by means of Session Moniker ("Session:!clsid:").
Given that, I've configured 'Server.exe' to run as 'Interactive user' via dcomcnfg.
Then I've implemented the function 'CoGetClassObjectInSession':
void CoGetClassObjectInSession(DWORD sessionId, Guid const& clsid, void *pvReserved, Guid const& riid, void **ppv)
{
ATL::CComQIPtr<IBindCtx> bindCtxInst;
COMCHK(CreateBindCtx(NULL, &bindCtxInst));
CComQIPtr<IMoniker> classMonikerInst;
COMCHK(::CreateClassMoniker(clsid, &classMonikerInst));
std::wstringstream ss;
ss << L"Session:" << std::dec << sessionId;
ULONG parsed;
ATL::CComQIPtr<IMoniker> sessionMonikerInst;
COMCHK(::MkParseDisplayNameEx(bindCtxInst, ss.str().c_str(), &parsed, &sessionMonikerInst));
ATL::CComQIPtr<IMoniker> classObjectMoniker;
COMCHK(sessionMonikerInst->ComposeWith(classMonikerInst, FALSE, &classObjectMoniker));
ATL::CComPtr<IClassFactory> sessionFactoryInst;
COMCHK(classObjectMoniker->BindToObject(bindCtxInst, NULL, riid, ppv));
}
and I use it in the service:
HRESULT CMyActivator::Activate()
{
try
{
// Impersonate the client
CComQIPtr<IServerSecurity> ss;
COMCHK(::CoGetCallContext(__uuidof(IServerSecurity), reinterpret_cast<void**>(&ss)));
callctx_impersonation_handle _handle(ss);
ImpersonationScope _imp_scope(_handle);
CComQIPtr<IClassFactory> ppv;
CoGetClassObjectInSession(/*session id for \\A1*/ 1, Guid(__uuidof(Q)), nullptr, Guid(__uuidof(IClassFactory)), reinterpret_cast<void**>(&ppv));
ENSURE(NULL != ppv, "'ppv' should not be null");
return S_OK;
}
catch(std::exception const& ex)
{
return E_FAIL;
}
catch(...)
{
return E_FAIL;
}
}
But nothing happens. I mean the service always launches the server in the session 0 which corresponds to the \SYSTEM account.
Client's security settings:
COMCHK(::CoSetProxyBlanket(
activatorQ
, RPC_C_AUTHN_DEFAULT
, RPC_C_AUTHZ_DEFAULT
, NULL
, RPC_C_AUTHN_LEVEL_DEFAULT
, RPC_C_IMP_LEVEL_DELEGATE
, NULL
, EOAC_DYNAMIC_CLOAKING));
Server.rgs file:
HKLM
{
NoRemove Software
{
NoRemove Classes
{
NoRemove AppID
{
ForceRemove '%APPID%' = s 'Test Server'
{
val RunAs = s 'Interactive User'
}
}
}
}
}
Am I doing something wrong?
UPDATE
I've finally found a solution. The registration script for the class 'Q' was missing the AppID field:
HKCR
{
NoRemove CLSID
{
ForceRemove {6FDE856C-F1B2-4466-8435-20F4AEF2C2E1} = s 'SMonClass Class'
{
ForceRemove Programmable
LocalServer32 = s '%MODULE%'
{
val ServerExecutable = s '%MODULE_RAW%'
}
TypeLib = s '{4FA39B0F-5B24-43C6-A5B1-11D8F34277B7}'
Version = s '1.0'
--> val AppID = s '%APPID%'** <-- This line
}
}
}