I had to try TomEE

I had to try TomEE and I liked it (TomEE 1.5.2 plus).

I started of building a simpel model, then an ejb to end of with JAX-RS and JAX-WS.

I missed the @Stateless annotation on the dk/jarry/tomee/todo/ws/ToDoImpl.java class in the first run and it was a pain to find the error. Place to work on default values.

eclipse project in a zip file

I am thrilled to learn that TomEE have chosen CXF for both JAX-WS and JAX-RS.

Next on my ToDo list is using JPA to store data in Derby or MySQL.


package dk.jarry.tomee.todo.model;

/**
 @author Michael Bornholdt Nielsen
 *
 */
public enum Priority {

  VARY_HIGE,
  HIGH,
  MEDIUM,
  LOW,
  VARY_LOW;
  
}

package dk.jarry.tomee.todo.model;

import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * If you forget @XmlRootElement you get something like this<br>
 <br> 
 * May 03, 2013 8:50:28 PM org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor
 * writeResponseErrorMessage<br>
 * WARNING: No message body writer has been found for response class ArrayList.
 
 @author Michael Bornholdt Nielsen
 */

@XmlRootElement
@Entity
public class ToDo {

  @Id
  @GeneratedValue
  private Integer id;

  private String subject;
  private String body;

  private Calendar created;
  private Calendar updated;

  private Priority priority;

  public String getSubject() {
    return subject;
  }

  public void setSubject(String subject) {
    this.subject = subject;
  }

  public String getBody() {
    return body;
  }

  public void setBody(String body) {
    this.body = body;
  }

  public Calendar getCreated() {
    return created;
  }

  public void setCreated(Calendar created) {
    this.created = created;
  }

  public Calendar getUpdated() {
    return updated;
  }

  public void setUpdated(Calendar updated) {
    this.updated = updated;
  }

  public Priority getPriority() {
    return priority;
  }

  public void setPriority(Priority priority) {
    this.priority = priority;
  }

  public Integer getId() {
    return id;
  }

}

package dk.jarry.tomee.todo.ejb;

import java.util.List;

import javax.ejb.Local;

import dk.jarry.tomee.todo.model.ToDo;

/**
 @author Michael Bornholdt Nielsen
 *
 */
@Local
public interface ToDoService {
  
  public List<ToDo> getAll();
  
}

package dk.jarry.tomee.todo.ejb;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.ejb.Stateless;

import dk.jarry.tomee.todo.model.Priority;
import dk.jarry.tomee.todo.model.ToDo;

/**
 @author Michael Bornholdt Nielsen
 *
 */
@Stateless
public class ToDoServiceBean implements ToDoService {
  
  private List<ToDo> todos = new ArrayList<ToDo>();
  
  public ToDoServiceBean(){
    
    System.out.println("ToDoService constructor...");
    
    ToDo toDo = new ToDo();
    toDo.setBody("Body 1");
    toDo.setCreated(Calendar.getInstance());
    toDo.setPriority(Priority.HIGH);
    toDo.setSubject("Subject 1");
    toDo.setUpdated(Calendar.getInstance());
    todos.add(toDo);
    
    toDo = new ToDo();
    toDo.setBody("Body 2");
    toDo.setCreated(Calendar.getInstance());
    toDo.setPriority(Priority.HIGH);
    toDo.setSubject("Subject 2");
    toDo.setUpdated(Calendar.getInstance());
    todos.add(toDo);
    
    toDo = new ToDo();
    toDo.setBody("Body 3");
    toDo.setCreated(Calendar.getInstance());
    toDo.setPriority(Priority.HIGH);
    toDo.setSubject("Subject 3");
    toDo.setUpdated(Calendar.getInstance());
    todos.add(toDo);
    
  }

  @Override
  public List<ToDo> getAll() {
    // TODO Auto-generated method stub
    return todos;
  }

}

package dk.jarry.tomee.todo.rest;

import java.util.List;

import javax.ejb.EJB;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import dk.jarry.tomee.todo.ejb.ToDoService;
import dk.jarry.tomee.todo.model.ToDo;

@Path("rest/todo")
public class ToDoResource {
  
  @EJB
  ToDoService toDoService;

  @GET
  public List<ToDo> getAll(){
    return toDoService.getAll();
  }
  
}

package dk.jarry.tomee.todo.ws;

import java.util.List;

import javax.jws.WebService;

import dk.jarry.tomee.todo.model.ToDo;

/**
 @author Michael Bornholdt Nielsen
 *
 */
@WebService
public interface IToDo {
  
  public List<ToDo> getAll();

}

package dk.jarry.tomee.todo.ws;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.WebService;

import dk.jarry.tomee.todo.ejb.ToDoService;
import dk.jarry.tomee.todo.model.ToDo;

/**
 * If you forget @Stateless you get something like this<br>
 * SEVERE: Error deploying CXF webservice for servlet
 * dk.jarry.tomee.todo.ws.ToDoImpl java.lang.IllegalArgumentException: Could not
 * find servlet dk.jarry.tomee.todo.ws.ToDoImpl in web application context
 * /dk.jarry.tomee.todo<br>
 <br>
 * See : <a
 * href="http://tomee.apache.org/examples-trunk/simple-webservice/README.html"
 * title="simple-webservice"></a>
 
 @author Michael Bornholdt Nielsen
 
 */
@Stateless
@WebService
public class ToDoImpl implements IToDo {

  @EJB
  ToDoService toDoService;

  public List<ToDo> getAll() {
    return toDoService.getAll();
  }

}

Created 03/05-2013 by Michael Bornholdt Nielsen