Spring Boot, Rest, MVC – wenns mal schneller gehen muss

Hallo zusammen,

seit dem letzten Blogeintrag hat sich einiges im Spring Ökosystem getan. Beispielsweise wurde das Spring-IO Projekt gegründet, was quasi eine Art Dachprojekt ist und die verschiedenen Spring-Projekte zusammenbringt.

Mir persönlich gefällt der Ansatz von Spring Boot sehr gut mit Ihrem Leitspruch “Simplifying Spring for everyone“. Nicht unbedingt für Enterprise Projekte, sondern für Rapid Prototyping – schnell mal was zusammenklimpern ohne das Ganze drumherum (was bei Spring zwar besser geworden ist aber immer noch viel ist).

Spring Boot – wenns schnell gehen muss.

Testen wir das Ganze doch einmal und machen einen Jumpstart.

Aktuell gibt es noch keinen Archetype für Spring Boot Projekte. Das Ganze ist wohl doch noch zu frisch.

Setup

Eine taufrische pom für ein Mavenprojekt findet sich hier.

Wir brauchen zunächst das neue spring.io Repository.

<repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
            <snapshots><enabled>true</enabled></snapshots>
</repository>

Und eine Abhängigkeit auf das boot-starter-web Modul.

<dependency>  
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>0.5.0.M6</version>
</dependency>

Einen schnellen Überblick über die verfügbaren Versionen kann man sich übrigens spontan hier verschaffen.

Testlauf

Wir implementieren ein einfaches Modell.

@XmlRootElement(name = "hello")
public class Hello {

    @XmlElement(name = "howToSayHello")
    private String hello;

    public Hello() {
    }

    public Hello(String hello) {
        this.hello = hello;
    }

    public String getHello() {
        return hello;
    }
}

Ausserdem einen einfachen Controller.

@Controller
@EnableAutoConfiguration
public class SimpleSpringController {

    public SimpleSpringController() {
        System.out.println("Log");
    }

    @RequestMapping(
        method = RequestMethod.GET,
        value = "/hello/{helloValue}",
        produces = MediaType.APPLICATION_XML_VALUE
    )
    @ResponseBody
    public Hello sayHello(@PathVariable(value = "helloValue") String hello){
        return new Hello(hello);
    }

    public static void main( String[] args )
    {
        SpringApplication.run(SimpleSpringController.class, args);
    }
}

Im Großen und Ganzen haben wir es hier mit einem Standard-Spring MVC Controller zu tun.

Einige Besonderheiten haben wir aber doch.

Eine Spring-Boot Applikation lässt sich sehr einfach starten.

 public static void main( String[] args )
    {
        SpringApplication.run(SimpleSpringController.class, args);
    }

ACHTUNG – SpringApplication.run() erwartet als ersten Paramter ein Object. Man neigt dazu, eine Instanz des Controllers zu übergeben.

Der Code in BeanDefinitionLoader sagt aber etwas anderes.

                if (source instanceof Class<?>) {
			return load((Class<?>) source);
		}
		if (source instanceof Resource) {
			return load((Resource) source);
		}
		if (source instanceof Package) {
			return load((Package) source);
		}
		if (source instanceof CharSequence) {
			return load((CharSequence) source);
		}
		throw new IllegalArgumentException("Invalid source type " + source.getClass());

Was man dann von Spring Boot bekommt ist die Fehlermeldung : Invalid source type SimpleSpringController. Damit kann man leider nicht viel anfangen.

Zurück zum Controller.

@EnableAutoConfiguration

Diese Annotation ist neu und kommt mit Spring-Boot. Was wird alles “Auto-Konfiguriert”?

Antwort – sehr viel. Das ist genau der Grund, wieso ich Spring Boot niemals für Projekte einsetzen würde (im jetztigen Stand). Es lassen sich Einschränkungen vornehmen, aber Spring-Boot ist einfach ideal für Prototyping Projekte geeignet. Was an Code notwendig ist für
die AutoConfiguration kann man sich hier ganz schön anschauen.

Testing

Die Anwendung lässt sich sehr einfach starten, lässt sie sich aber auch testen?

Mit Spring 3.2.x haben wir ein sehr schönes Testing-Framework für Spring-MVC Controller bekommen. Lässt sich das mit Spring Boot vereinbaren?

Hierfür brauchen wir zumindest die Spring Test Abhängigkeit.

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.0.RC1</version>
            <scope>test</scope>
 </dependency>

Spring Boot kommt per Default bereits mit Spring 4.0, deswegen müssen wir die Testabhängigkeit auch mit 4.0.0 deklarieren (führt zu Runtime-Exceptions, wenn nicht:().

Ein einfacher Test könnte so aussehen.

@Test
	public void testController() throws Exception
	{
		MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new SimpleSpringController()).build();
		mockMvc.perform(get("/hello/test").accept(MediaType.APPLICATION_XML)).andExpect(
				new ResultMatcher()
				{
					@Override
					public void match(MvcResult result) throws Exception
					{
						JAXBContext context = JAXBContext.newInstance(Hello.class);
						Hello hello = (Hello)context.createUnmarshaller().unmarshal(
								new ByteArrayInputStream(result.getResponse()
										.getContentAsByteArray()));
						assertEquals("test", hello.getHello());
					}
				});
	}

Auch das funktioniert sehr einfach.

Wir setzen einen Rest-Call ab gegen den Controller und der richtigen URL.Testweise deserialisieren wir das XML was wir zurückbekommen mittels JAXB.

Eine Abhängigkeit auf Spring 4?

Spring 4 ist zwar nett und immerhin bereits der RC1, aber eigentlich noch ein wenig experimentell. Muss ich, wenn ich mit Spring Boot arbeite mit Spring 4 arbeiten?

Antwort – erstmal ja – ich kenne zumindest keinen einfachen Weg auf eine Stable-Version zurückzugehen.

Fazit

Spring Boot ist einfach und schnell. Ich brauche keine speziellen Dependencies, es funktioniert alles direkt. Um auf die Schnelle Dinge auszuprobieren ideal. Ich werde Spring Boot definitiv zukünftig für kleine Prototyping Projekte einsetzen.

Source-Code

Effective Trainings & Consulting - Martin Dilger



Hat Ihnen dieser Blog-Eintrag gefallen? Ich stelle in diesem Blog Informationen über Tools, Frameworks und Werkzeuge zur Verfügung, die mich produktiver machen. Vielleicht kann ich auch Ihnen helfen, produktiver zu werden.


Ich unterstütze Sie als freier Mitarbeiter bei der Entwicklung von Software-Projekten, Agiler Arbeit sowie Schulungen / Fortbildungen.


Jeden Tag ein bisschen produktiver - ab heute