Tuesday, 26 February 2008
Canoo WebTest
Monday, 25 February 2008
Personal Information Online
Tuesday, 19 February 2008
File Download In Spring
public class DownloadController implements Controller {
/*
* Spring dependency injection
*/
private XService xService;
public void setxService(
XService xService) {
this.xService = xService;
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String idStr = request.getParameter("id");
if (idStr != null) {
long id = Long.parseLong(idStr);
String data = xService.getData(id);
doDownload(request, response, data, "file" + idStr + ".xml");
}
return null;
}
private void doDownload(HttpServletRequest request,
HttpServletResponse response, String data, String filename)
throws IOException {
int length = data.length();
ServletOutputStream op = response.getOutputStream();
response.setContentType("text/plain");
response.setContentLength(data.length());
response.setHeader("Content-Disposition",
"attachment; filename=\"" + filename + "\"");
byte[] bbuf = data.getBytes();
op.write(bbuf, 0, length);
op.flush();
op.close();
}
}
Accessing EJB 3 from Spring 2.5
<beans>
...
<!-- *** EJBs *** -->
<!-- REMOTE JNDI CONNECTION -->
<bean id="remoteJndiTemplate"
class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.jnp.interfaces.NamingContextFactory
</prop>
<prop key="java.naming.provider.url">
localhost
</prop>
<prop key="java.naming.security.principal">
username
</prop>
<prop key="java.naming.security.credentials">
mycredentials
</prop>
</props>
</property>
</bean>
<bean id="abstractRemoteSlsb" abstract="true"
class="org.springframework.ejb.access.
SimpleRemoteStatelessSessionProxyFactoryBean">
<property name="lookupHomeOnStartup" value="false">
<property name="jndiTemplate">
<ref bean="remoteJndiTemplate" />
</property>
</bean>
<bean id="myService" parent="abstractRemoteSlsb">
<property name="jndiName"
value="myapp/MySessionBeanImpl/remote">
<property name="businessInterface"
value="au.com.package.name.MySessionBean">
</bean>
...
</beans>
Friday, 15 February 2008
Logging A StackTrace Exception
try {
..
}
catch (Exception e) {
LOG.error(e);
}
Can you see what is really going on? If you have a look at commons logging's API, there are 2 error methods in the Log interface. All the above code does is it logs e.toString() to the error log, which means the error stack trace will be lost! Here is what you need to do instead:
try {
..
}
catch (Exception e) {
LOG.error("problem...", e);
}
Wednesday, 13 February 2008
EJB 3.0 LazyInitializationException In Unit Tests
- Create a remote interface
- Create a base interface from the current local session bean interface
- Delete all abstract methods on the local interface and extend the base interface
- Update the remote interface to extend the base interface
- Add the methods that I want to unit test in the remote interface
- Change the methods that I want to test in the implementation to public
- Edit the implementation class so that it extends both the local and remote interface
Gosh, if that is not time consuming, tell me what is! After all the effort, finally I wrote the actual unit test class, wrote the code to get the remote home that I created earlier using JNDI in the setUp() method, wrote my test, compile the whole project, and then start my JBoss.To my surprise, I got LazyInitializationException, so I thought, all the effort that I did earlier was useless! I tried googling and found some ways to avoid this exception. There are actually 4 ways to do this:
- Change the session bean to be stateful, and change the persistence context type to EXTENDED. Do I really need to do this just to get the test working?
- Run the session from within another session bean. Do I really need to create another one just to get the test working?
- Make fetch type EAGER (obviously). Impossible! There are lots of data, and therefore the laziness
- Create another method and use Hibernate's JOIN FETCH strategy. This one seems to be the cleanest and the least destructive solution
Honestly, why is it so hard to unit test a Session Bean? If the project had been done in Spring, there are Spring tools that can be utilised and therefore unit testing would have been much easier! See my earlier post to work around this Exception in Spring.
Tuesday, 12 February 2008
Grails
I also came across another tutorial that I thought would allow Grails to connect to existing EJBs in an existing container. You would actually need to copy the POJO implementations into the project in order to make it work.
Overall, I really like its features ease of use and I reckon it has a great potential to penetrate the enterprise market in the future. It is based on well known and enterprise-ready frameworks: Spring, Hibernate, and Groovy. Well done guys!
Tuesday, 5 February 2008
java.lang.OutOfMemoryError: PermGen space
It turns out that the default Permanent Generation memory is 64K, which is definitely not enough! We then increased the size by adding -XX:PermSize="newSize"
Multiple JBoss Instances
There are 2 ways to achieve this:
- Use different IP addresses on the machine
- Use different ports on the machine
The first method is the one recommended by JBoss because it reduces complications in tracking down problems in the future.
Links: