Error creating child actor - akka

In an Actor I create a child actor like below
ActorRef sessionEventHandlerActor = getContext().actorOf(Props.create(SessionHandler.class), sessionId);
and this is SessionHandler actor:
public class SessionHandler extends UntypedActor {
public SessionHandler() {
getContext().setReceiveTimeout(Duration.create(1, TimeUnit.MINUTES));
}
#Override
public void onReceive(Object message) throws Exception {
}
}
and I get following error:
Caused by: akka.actor.ActorInitializationException: You cannot create an instance of [actors.SessionHandler] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation.
at akka.actor.ActorInitializationException$.apply(Actor.scala:165)
at akka.actor.Actor$class.$init$(Actor.scala:421)
at akka.actor.UntypedActor.<init>(UntypedActor.scala:97)
at org.esi.actors.SessionHandler.<init>(SessionHandler.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at akka.util.Reflect$.instantiate(Reflect.scala:45)
at akka.actor.NoArgsReflectConstructor.produce(Props.scala:358)
at akka.actor.Props.newActor(Props.scala:249)
at akka.actor.ActorCell.newActor(ActorCell.scala:552)
at akka.actor.ActorCell.create(ActorCell.scala:578)
I do not see any issue in how I create the actor. Does any one know what the problem can be?
Thank you

I think there's no problem anymore, but I think you need to leave out the the sessionId argument, because create will try to apply it to the constructor.
ActorRef sessionEventHandlerActor = getContext().actorOf(Props.create(SessionHandler.class));
As far as I understood the Java API. I only used it in scala.

Related

Mapping #Json property with JDBI

According to JDBI document https://jdbi.org/#_jackson_2, it seems that it's quite straight forward to have a json property of your object model, however I've tried the following and it ran into many issues.
DB: Postgres with a column type of Jsonb
class Event {
private String name;
#Json
private EventProperty jsonProperty;
...
}
Datasource has been configured with
#Bean
public Jdbi jdbi(TransactionAwareDataSourceProxy eventStoreTxAwareDataSourceProxy) {
Jdbi jdbi = Jdbi.create(eventStoreTxAwareDataSourceProxy);
jdbi.installPlugin(new PostgresPlugin());
jdbi.installPlugin(new Jackson2Plugin());
}
SQL for binding list of insertion
INSERT INTO event (name, json_property)
VALUES (
:name,
:jsonProperty)
When running the code to insert, the following error occurred:
org.jdbi.v3.core.statement.UnableToCreateStatementException: no argument factory for type com.EventProperty [statement:"INSERT INTO event (...]
If I created EventPropertyArgumentFactory and using Jackson ObjectMapper and writeValueAsString then I can save it to DB. However, when retrieving it back from DB by
try (Handle handle = jdbi.open()) {
EventDao dao = handle.attach(EventDao.class);
return dao.findByName(name);
}
throws the following errors
java.lang.ClassCastException: Cannot cast org.postgresql.util.PGobject to com.EventProperty
I thought all I needed to do is declare the field annotated with #Json, the DB column has to be json/jsonb type and install the plugins, but seems like this is not the case?
Anyone has tried this successfully, without having to define custom row mapper and argument factory implementation?
Thanks
The documentation says:
// use #Json qualifier:
...
// also works on bean or property-mapped objects:
class MyBean {
private final MyJson property;
#Json
public MyJson getProperty() { return ...; }
}
I've checked and it's unfortunate but #Json only works when placed on a property( i.e. getter or setter) and not on a field.
You can make your work easier if you use Lombok library.
Modify lombok.config file by adding this line:
lombok.copyableannotations += org.jdbi.v3.json.Json
Now in bean declaration you can do this:
#Data // will generate setters and getters among other things
class Event {
private String name;
#Json // will be copied onto getter and setter due to config change we made
private EventProperty jsonProperty;
...
}
Have fun!
Not sure if you've figured this out by now but I just ran into this same issue and finally figured it out.
Basically, you just have to add the annotation on the getter or setter of the class, not the top-level field.
class Event {
private String name;
private EventProperty jsonProperty;
...
#Json
public getEventProperty() {
return jsonProperty;
}
}

LazyException in web service EJB

sorry for my bad english..
my model:
public class Dog {
private Integer id;
private String mame;
private List<Dog> childs; // lazy
}
my web service:
#WebService
public class DogWS {
#EJB
private DogRepository dogs
public Dog get(String id){
return dogs.get(id); // lazy exception
}
}
when i make and search with SOAPui tool.. i receive an Exception:
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
how to make and 'servlet filter' or similar in this case?
The problem is with accessing lazy collection after a dog object has been detached.
dogs.getChilds().size() method call before dog object was detached should solve the problem

PowerMock: how to mock static methods which have the same name in a class?

Today I'm working on a class with two static methods which have same name, different parameter types. When I try to mock one of the methods, I encounter this problem.
This is the class to be mocked:
//RequestUtil.java, I want to mock the second config method
public class RequestUtil {
public static void config(String request, List parameters){}
public static void config(HttpServletRequest request, List parameters){}
}
This is the test class:
//RequestUtilTest.java
#RunWith(PowerMockRunner.class)
#PrepareForTest(RequestUtil.class)
public class RequestUtilTest {
//this test will throw NullPointException
#Test
public void testConfig() throws Exception {
mockStatic(RequestUtil.class);
doNothing().when(RequestUtil.class, "config", any(HttpServletRequest.class), anyList());
}
}
Run this test, and it will throw exceptions:
java.lang.NullPointerException
at java.lang.Class.isAssignableFrom(Native Method)
at org.powermock.reflect.internal.WhiteboxImpl.checkIfParameterTypesAreSame(WhiteboxImpl.java:2432)
at org.powermock.reflect.internal.WhiteboxImpl.getMethods(WhiteboxImpl.java:1934)
at org.powermock.reflect.internal.WhiteboxImpl.getBestMethodCandidate(WhiteboxImpl.java:1025)
at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:948)
at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882)
at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859)
at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)
at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)
...
This exception is caused by:
doNothing().when(RequestUtil.class, "config", any(HttpServletRequest.class), anyList());
However, if I mock the first config method, that means, replace this line with:
doNothing().when(RequestUtil.class, "config", anyString(), anyList());
everything is Ok.
The order of the config methods in the defination of RequestUtil class has nothing to do with this issue. No matter config(HttpServletRequest, List) is the first or second config method of RequestUtil, the mock of config(HttpServletRequest, List) will be failure.
Also, if I modify the HttpServletRequest to another "simpler" type, such as int, this issue disappears.
It seems to be a bug of PowerMock, but I'm not sure. I searched Google and stackoverflow, but there are no post or discuss on this issue. So anyone can help me?
Test frameworks I use:
JUnit: 4.10
PowerMock: 1.5.4
Mockito: 1.9.5
It seems to be a PowerMock bug with overloaded methods.
You could bypass it by looking up the method object using the WhiteBox class, and mocking explicitly this method.
...
import org.powermock.reflect.Whitebox;
//RequestUtilTest.java
#RunWith(PowerMockRunner.class)
#PrepareForTest(RequestUtil.class)
public class RequestUtilTest {
//this test will throw NullPointException
#Test
public void testConfig() throws Exception {
mockStatic(RequestUtil.class);
Method method = Whitebox.getMethod(RequestUtil.class, "config", HttpServletRequest.class, List.class);
doNothing().when(RequestUtil.class, method);
}
}
A similar question have been asked previously on stackoverflow.

How to mock a java class inside a Grails unit test?

I have a java class, which I've added to my resources.groovy like this:
import persistentrep.ReasoningXMLLoader;
// Place your Spring DSL code here
beans = {
reasoningXMLLoader(ReasoningXMLLoader)
}
I then use this class in my GrailsService:
class XMLService
{
def reasoningXMLLoader
def someMethod()
{
reasoningXMLLoader.doSomething()
}
}
Obviously, I want to write a unit test that mocks reasoningXMLLoader and injects it into the service.
I tried using #Mock, MockFor and mockFor and I keep getting org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Cannot add Domain class [class persistentrep.ReasoningXMLLoader]. It is not a Domain! error :
org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Cannot add Domain class [class persistentrep.ReasoningXMLLoader]. It is not a Domain!
at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:916)
at org.codehaus.groovy.grails.commons.DefaultGrailsApplication.addArtefact(DefaultGrailsApplication.java:615)
at org.codehaus.groovy.grails.commons.GrailsApplication$addArtefact.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:131)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:226)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
at grails.test.mixin.domain.DomainClassUnitTestMixin.mockDomain(DomainClassUnitTestMixin.groovy:128)
at com.vpundit.www.XMLServiceTests.mockDomain(XMLServiceTests.groovy)
at com.vpundit.www.XMLServiceTests.setUp(XMLServiceTests.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Is there a way to mock this using the Grails built-in mocking framework, or do I need to use something like Mockito?
What is the best way to inject the mock? Is there some Grails magic that can do it for me, or do I just use the exposed property -
service.reasoningXMLLoader = mock?
I finally managed to figure out how to do this. I was getting the exception, because I was trying to use the #Mock() attribute, which apparently cannot be used for what I was trying to do.
The task is actually pretty straight forward after reading the Groovy documentation for mocking with closures and with MockFor. I should have realized earlier that Groovy's documentation is better suited for this type of information that Grails'
So here is how to accomplish what I wanted to do, using closures. It's very neat actually:
void testParseXml() {
String xml = "test string"
def mockReturnObject = {create your object to be returned here}
def loader = [parseString:{ mockReturnObject }] as ReasoningXMLLoader
service.reasoningXMLLoader = loader
def result = service.parseXML(xml)
do assertions here
}
Here is how to do the same with mocks:
void testParseXml() {
String xml = "test string"
def mockReturnObject = {create your object to be returned here}
def loader = new MockFor(ReasoningXMLLoader)
loader.demand.parseString{mockReturnObject}
service.reasoningXMLLoader = loader.proxyInstance()
def result = service.parseXML(xml)
do assertions here
}
I hope this helps someone who is new to Grails and Groovy.

using JPA2 for an entity update

I'm not really used to JPA... so this is more like a basic question
I use JPA2 - (not hibernate)
I have this function, and I want to make an update on my
#RequestScoped // (this is javax.faces.bean.RequestScoped)
#Stafeful // (this is javax.ejb.Stateful)
public class MyProvider {
#Inject
private EntityManager entityManager;
/* some variables and getters and setters */
public void setLocked(Long id, boolean locked) {
entityManager.getTransaction().begin();
user = userProvider.findUserByID(id);
user.setLocked(locked);
entityManager.persist(user);
// i also tried it with refresh instead of persist
entityManager.refresh(user);
entityManager.getTransaction().commit();
}
}
but i get this error at this point
entityManager.getTransaction().begin();
java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:996)
org.jboss.as.jpa.container.AbstractEntityManager.getTransaction(AbstractEntityManager.java:498)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:264)
org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52)
org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137)
org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:260)
org.jboss.weld.bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:51)
org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56)
org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:105)
org.jboss.weldx.persistence.EntityManager$-1570536921$Proxy$_$$_Weld$Proxy$.getTransaction(EntityManager$-1570536921$Proxy$_$$_Weld$Proxy$.java)
de.demoapp.controller.UserController.setLocked(UserController.java:452)
de.demoapp.controller.UserController.lock(UserController.java:721)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.apache.el.parser.AstValue.invoke(AstValue.java:262)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
javax.faces.component.UICommand.broadcast(UICommand.java:315)
javax.faces.component.UIData.broadcast(UIData.java:1093)
javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
I have also read this article - but it doesn't really help, it still throws: javax.persistence.TransactionRequiredException: no transaction is in progress
I'm not sure if I do something essential wrong...
Yes, there is something essential wrong. You have mismatch between container managed transactions and user managed transactions. Documentation for EntityManager.getTransaction tells quite clearly what is the problem:
Throws:
IllegalStateException - if invoked on a JTA entity manager
Problem comes from entityManager.getTransaction() in your code, hacking with /flush/persist/etc does not matter because exception occurs before those lines are executed.
More details about the subject can be found from: http://en.wikibooks.org/wiki/Java_Persistence/Transactions
okay, because of the the real good answer of Mikko, i do it know right:
I import:
import javax.ejb.TransactionAttribute;
import static javax.ejb.TransactionAttributeType.REQUIRED; // this one is important!!!
my Annotations are now:
#RequestScoped
#Stateful
#TransactionAttribute(value=REQUIRED)
public class UserProvider {
public void setLocked(Long id, boolean locked) {
User user = new User();
user = findUserByID(id);
user.setLocked(locked);
entityManager.merge(user);
}
}
now it works, but the reason is the 2nd import and the anotation!