Friday, December 25, 2009

Spring 3.0 & Maven

I wanted to go over the process of upgrading the build from Spring 2.5 to Spring 3.0 (3.0 release announcement) using Maven for the build process. For almost all applications from basic dependency injection to webapps, and even enterprise applications with Spring Web Services and Spring Integration all upgraded without any issues.

I did change all the builds to use the SpringSource Enterprise Bundle Repository. It has all the Spring projects and also repackaged versions of many other open source ones. SpringSource did this to make all the artifacts OSGi enabled and also corrected any errors in dependencies where possible. It isn't necessary to use this repository and all Spring projects are also deployed to the main Maven repository tool.

I primarily switched so the projects could be more easily imported into an OSGi environment if someone needed to the SpringSource Enterprise Bundle Repository (EBR) and to avoid any dependency resolution issues since some artifacts will need to be resolved from the EBR.

Keith Donald, from SpringSource, did a blog discussing using Maven with Spring 3.0. It's called Obtaining Spring 3 Artifacts with Maven and is definitely worth reading to understand things in more detail.

Thursday, December 24, 2009

Spring & Spring by Example


I've been working a lot on getting Spring by Example updated for Spring 3.0. A Simple Grails Webapp was also added to this release.

Almost everything is upgraded except for the AspectJ LTW example, GWT ones, and OSGi. The AspectJ one, I've had an odd problem that I've updated everything to use the Spring Repository, but when I change it to from Spring 2.5.6 to 3.0, the weaving stops working. No errors and no success resolving the issues, but I will keep working on it. I had trouble with the GWT webapps too, but I think it's mainly build related. I'll probably start over with a new project using GWT 2.0 and build the examples back up. For the Spring dm Server (OSGi) ones, I just haven't had time. I don't think there will be a problem upgrading them.

Everything is versioned on the site, so all past site releases and examples are available (Spring by Example 2.5.x, which is version 1.0.3). Just follow the subversion instructions at the end of the examples to checkout the correct version of the project the example describes. If you're ever not sure what version of something the example uses, check the 'Project Information' section at the end of the example and/or the Maven POM.

I have a Spring Roo example in progress that is the basis for a simple person and address example. Ideally I'd like to even use Roo to replace many of the webapp examples and/or have as much of them generated as possible. I'd also like to spend time redoing the web services add-ons for Roo and get them into a releasable state, but I just haven't had the time. I'm hoping it will fit in with a future project soon, so maybe it will get done.

I also plan on getting SpEL, REST, and some other examples together for the website. I've also done a lot of Flex work over the last year, so I'd really like to do some more advanced Flex examples and especially a basic messaging example and security example.

Monday, December 14, 2009

Spring Roo, SpringOne 2009, Spring by Example

I haven't been active on my blog or Spring by Example for a long time. I was just really busy. In that time I've been working with Flex, Spring BlazeDS Integration, Spring MVC, Spring Web Flow, Spring Roo, and other things.

Spring Roo was very useful. I made my own add-ons that generated web services based on a JPA bean and even the matching ActionScript class. I'm going to try working on a better version based on the new Spring Roo add-on format when I have time. What I did so far is checked into subversion. It was developed against Spring Roo 1.0.0.RC1 before there was standardized add-on format. I was very rushed when I did this, so it's functional but very basic and needs to be redone.

SpringOne 2009 in New Orleans was good. A lot of interesting presentations and nice getting to see different people again. The cloud presentation in the keynote was very interesting. Some of the improvements in Spring MVC that are in Spring 3.0 are quite nice. There is JSR-303 (Bean Validation) support, Type Conversion and Validation (blog by Keith Donald), REST support, and an MVC namespace for reduced configuration. Some of the SpEL (Spring EL) integration with other projects like Spring Integration and Spring Security look really useful. SpringOne is a really good conference and I'm glad I went.

I've been working for over a week on upgrading Spring by Example's projects to Spring 3.0.0.RC3. Most have upgraded without any issues, although I'm having trouble upgrading the GWT ones. I'm going to probably leave them and the dm Server (OSGi) examples as they are for now and finalize the other examples, double check everything is working, and update the documentation so I'll be ready for a release for the Spring 3.0 final release. The webapps (other than GWT & dm Server ones) have not only been upgraded to Spring 3.0, but have also been upgraded to JPA and following Spring MVC best practices as much as possible if they weren't already. All of them were changed to use the Spring MVC namespace which reduced their configuration slighlty. Also the applications with security had their login/logout pages changed to be served through Tiles and support i18n. When I have time I'd like to change the webapps to use jspx and use RESTful URLs.

I'm hoping to get a release of Spring by Example out in the next few days. Then continue working on everything else and possibly have another release before the end of the year. I'd also like to get a SpEL and Spring MVC REST examples added to the site.

Sunday, May 31, 2009

Spring, Flex, and other things


I finally just did another release for Spring by Example. One example is Simple Flex Webapp and the other is Simple Spring Integration.

I just did the Flex example recently and the Spring Integration one was done a little while ago, but I never wrote about it for the site. There's also a more advanced example using queues and splitting, but I'm not sure if the flow really makes sense although it needs to be the way it is to split and aggregate things.

I've been working with Flex for a few months now and I still think it's really nice. It's the best thought out UI framework I've ever worked with. Besides it looking very nice with minimal effort, it's very easy to do many things, ActionScript is a very comfortable environment for someone that knows Java, JavaScript, and is used to doing web development. Also, I'm impressed with how many things Adobe has open sourced. The Adobe BlazeDS provides a really good bridge between Java and Flex for remoting and messaging. Also the Spring BlazeDS Integration project from SpringSource really simplifies configuration and ease of use as you would expect. I think they've done a really great job again. Spring Integration also has integration with Spring BlazeDS Integration so from a message flow you could send a message to a Flex UI and the flow could wait for a response to come back.

The Adobe Cairngorm project for providing client side MVC in Flex is nice too. It helps provide separation of business logic from UI components and encourages using Flex's data binding to transfer information from the controller to the view using a bound model. Adobe suggests having the model a singleton, but it would be nice if a dependency injection framework was used instead. Spring ActionScript gives basic functionality, but just the bare minimum compared to Spring's Java implementation. Although I think it could become a lot nicer without too much effort.

I'm going to try to post more Flex examples including more advanced Flex usage as well as ones using messaging. A bridge can be created between JMS queue and a Flex queue or messages can be sent directly to the Flex queue. Also, I'd like to start spending more time using the SpringSource dm Server. The new web features that are being added to version 2.0 really interest me.


Sunday, April 19, 2009

Maven JAXB Generation Part II

I've already done a posting on using Maven to generate JAXB with the Fluent API and this adds making the JAXB beans serializable and setters for lists. Add the file jaxb-bindings.xjb to the 'src/main/resources' with the config below and JAXB beans will implement serializable.

Also by default, collections only have getters. The JAXB 2.1 Collection setter Injector Plugin will also generate a setter for any collection. I found this useful while serializing JAXB beans between Java and ActionScript with BlazeDS (while using Spring BlazeDS Integration. BlazeDS only serializes something if it has a getter and a setter. Unfortunately I couldn't find this in a Maven repo, but you can install it locally or into your Nexus server.




<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-Xfluent-api</arg>
<arg>-Xcollection-setter-injector</arg>
</args>
<schemaDirectory>src/main/resources</schemaDirectory>
<plugins>
<plugin>
<groupId>net.java.dev.jaxb2-commons</groupId>
<artifactId>jaxb-fluent-api</artifactId>
<version>2.1.8</version>
</plugin>
</plugins>
</configuration>
<dependencies>
<!-- Had to manually install in repo, not in main java.net repo. -->
<dependency>
<groupId>org.jvnet.jaxb2-commons</groupId>
<artifactId>collection-setter-injector</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</plugin>

src/main/resources/jaxb-bindings.xjb
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">

<jxb:bindings>
<jxb:globalBindings>
<jxb:serializable/>
</jxb:globalBindings>
</jxb:bindings>

</jxb:bindings>

Monday, February 16, 2009

Spring Modules Valang

I've been working on adding enhancements to Spring Modules Valang. I've added a number of new features so far and I have two versions uploaded to the Spring by Example Maven Repository (org.springbyexample.validation:sbe-validation). I have it under a different group id and artifact name so there aren't' any collisions in the future with Spring Modules releases.

I'm also working on documentation, but that's going to take a little longer to finish.

Version 0.91

  • Bytecode generation added to DefaultVisitor as a replacement for reflection accessing simple properties (BeanPropertyFunction) for a significant performance improvement.
  • Basic enum comparison support. In the expression below the personType is an enum and the value STUDENT will be convereted to an enum for comparison. The value must match an enum value on the type being compared or an exception will be thrown.

    personType EQUALS ['STUDENT']
    For better performance the full class name can be specified so the enum can be retrieved during parsing. The first example is for standard enum and the second one is for an inner enum class .

    personType EQUALS ['org.springmodules.validation.example.PersonType.STUDENT']

    personType EQUALS ['org.springmodules.validation.example.Person$PersonType.STUDENT']
  • Where clause support. In the expression below, the part of the expression price will only be evaluated if the personType is 'STUDENT'. Otherwise the validation will be skipped.

    price < 100 WHERE personType EQUALS ['STUDENT']
  • Improved performance of 'IN'/'NOT IN' if comparing a value to a java.util.Set it will use Set.contains(value). Static lists of Strings (ex: 'A', 'B', 'C') are now stored in a Set instead of an ArrayList.
  • Functions can be configured in Spring, but need to have their scope set as prototype and use a FunctionWrapper that is also a prototype bean with set on it.
  • Removed servlet dependency from Valang project except for the custom JSP tag ValangValidateTag needing it, but running Valang no longer requires it. This involved removing ServletContextAware from it's custom dependency injection. If someone was using this in a custom function, the function can now be configured directly in Spring and Spring can inject any "aware" values.

Version 0.92

  • Removed custom dependency injection since functions can be configured in Spring.
  • Added auto-discovery of FunctionWrapper beans from the Spring context to go with existing auto-discovery of FunctionDefinition beans.

Generating Bytecode


I've been looking at the Javassist project. It's really nice. It's a higher level API for manipulating and generating bytecode. Below is an example generating a new class that implements and interface, and then implements the interface. By generating this, it avoids reflection and is significantly faster in tests I've run.



ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass(classFunctionName);

cc.addInterface(pool.get("org.springmodules.validation.valang.functions.Function"));

StringBuilder generatedMethod = new StringBuilder();
generatedMethod.append("public Object getResult(Object target) {");
generatedMethod.append(" return ");
generatedMethod.append(" ((" + className + ")target).");
generatedMethod.append(property);
generatedMethod.append("();");

CtMethod m = CtNewMethod.make(generatedMethod.toString(), cc);
cc.addMethod(m);

result = (Function)cc.toClass().newInstance();

Sunday, February 1, 2009

Spring by Example Update

I've been working for a while on an update to Spring by Example. It just happens to be the 1.00 release so I wanted it to be a little bit bigger. It's over a years worth of work at this point and I think it shows how much work I've put into it. I'm happy that it's helping people and will continue to work on it as I have time. I wish I had more. Especially to keep doing more work with the Spring dm Server. Below is a list of the lastest examples posted and I'm working on other ones that I'll hopefully be able to finalize over the next month.