404er bei Restful mit EclipseLink

andyx1975

Aktives Mitglied
Hallo,

ich habe vor einen Restful Service zu Programmieren, jedoch kann ich den Service per Link nicht ansprechen. Ich benutze SmartGWT und den damit ausgelieferten Jetty. Ich versuche den Service über "http://localhost:8888/CustomerService/rest/customers/1" aufzurufen und erhalte einen 404er als Ergbnis. Was mache ich falsch?

Wenn ich Jetty starte bekomme ich in der Konsole die folgende Meldung:

Java:
Aug 10, 2011 4:38:21 PM com.sun.jersey.api.core.WebAppResourceConfig init
Information: Scanning for root resource and provider classes in the Web app resource paths:
  /WEB-INF/lib
  /WEB-INF/classes
Aug 10, 2011 4:38:25 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
Information: Root resource classes found:
  class uds.web.admin.data.CustomerService
Aug 10, 2011 4:38:25 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
Information: Provider classes found:
  class org.codehaus.jackson.jaxrs.JacksonJsonProvider
  class org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider
  class org.codehaus.jackson.jaxrs.JsonParseExceptionMapper
  class org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper
Aug 10, 2011 4:38:25 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
Information: Initiating Jersey application, version 'Jersey: 1.8 06/24/2011 12:17 PM'

Der Aufruf GWT.getModuleBaseURL() ergibt folgendes Erbenis:
http://127.0.0.1:8888/uds.web.admin.webAdminUds/

Meine web.xml sieht wie folgt aus:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<persistence-context-ref>
<persistence-context-ref-name>persistence/em</persistence-context-ref-name>
<persistence-unit-name>CustomerService</persistence-unit-name>
</persistence-context-ref>
</web-app>
[/XML]

Mene Service Klasse wie folgt:

Java:
package uds.web.admin.data;

import java.util.List;
 
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
 
@Stateless
@LocalBean
@Path("/customers")
public class CustomerService {
 
    @PersistenceContext(unitName="CustomerService", 
                        type=PersistenceContextType.TRANSACTION)
    EntityManager entityManager;
 
    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public void create(Customer customer) {
        entityManager.persist(customer);
    }
 
    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("{id}")
    public Customer read(@PathParam("id") long id) {
        return entityManager.find(Customer.class, id);
    }
 
    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public void update(Customer customer) {
        entityManager.merge(customer);
    }
 
    @DELETE
    @Path("{id}")
    public void delete(@PathParam("id") long id) {
        Customer customer = read(id);
        if(null != customer) {
            entityManager.remove(customer);
        }
    }
 
    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("findCustomersByCity/{city}")
    public List <Customer> findCustomersByCity(@PathParam("city") String city) {
        Query query = entityManager.createNamedQuery("findCustomersByCity");
        query.setParameter("city", city);
        return query.getResultList();
    }
 
}

Die Customer Klasse:
Java:
package uds.web.admin.data;

import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;
 
import java.util.Set;


/**
 * Entity implementation class for Entity: Customer
 *
 */

@Entity
@XmlRootElement
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
 
    @Id
    private long id;
 
    @Column(name="FIRST_NAME")
    private String firstName;
 
    @Column(name="LAST_NAME")
    private String lastName;
 
    @OneToOne(mappedBy="customer", cascade={CascadeType.ALL})
    private Address address;
 
    @OneToMany(mappedBy="customer", cascade={CascadeType.ALL})
    private Set<PhoneNumber> phoneNumbers;
 
    public long getId() {
        return this.id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getFirstName() {
        return this.firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return this.lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public Address getAddress() {
        return this.address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    public Set<PhoneNumber> getPhoneNumbers() {
        return this.phoneNumbers;
    }
 
    public void setPhoneNumbers(Set<PhoneNumber> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }
 
}


Die Address Klasse:
Java:
package uds.web.admin.data;

import java.io.Serializable;
import javax.persistence.*;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

/**
 * Entity implementation class for Entity: Address
 *
 */
@Entity

public class Address implements Serializable {
    private static final long serialVersionUID = 1L;
 
    @Id
    private long id;
 
    private String city;
 
    private String street;
 
    @OneToOne
    @PrimaryKeyJoinColumn
    private Customer customer;
 
    public long getId() {
        return this.id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getCity() {
        return this.city;
    }
 
    public void setCity(String city) {
        this.city = city;
    }
 
    public String getStreet() {
        return this.street;
    }
 
    public void setStreet(String street) {
        this.street = street;
    }
 
    @XmlInverseReference(mappedBy="address")
    public Customer getCustomer() {
        return customer;
    }
 
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
 
}

Und die PhoneNumber Klasse:
Java:
package uds.web.admin.data;

import java.io.Serializable;
import javax.persistence.*;
 
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

/**
 * Entity implementation class for Entity: PhoneNumber
 *
 */
@Entity
@Table(name="PHONE_NUMBER")
public class PhoneNumber implements Serializable {
    private static final long serialVersionUID = 1L;
 
    @Id 
    private long id;
 
    private String num;
 
    private String type;
 
    @ManyToOne
    @JoinColumn(name="ID_CUSTOMER")
    private Customer customer;
 
    public long getId() {
        return this.id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getNum() {
        return this.num;
    }
 
    public void setNum(String num) {
        this.num = num;
    }
 
    public String getType() {
        return this.type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    @XmlInverseReference(mappedBy="phoneNumbers")
    public Customer getCustomer() {
        return this.customer;
    }
 
    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
 
}
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 5909

Gast
sieht aus als hättest du den contextpath der webapp vergessen (in der url)
 

andyx1975

Aktives Mitglied
Ah ok...endlich mal ein Hinweis...Ich bin zimelich neu in der Webprogrammierung...habe zuvor ausschließlich Swing gemachacht. Wie muss der Context-Path aussehen? Danke Andy
 
G

Gelöschtes Mitglied 5909

Gast
der name deiner webapp / des war files. Oder heißt die webapp etwa CustomerService?
 

andyx1975

Aktives Mitglied
Meinst du den welcome file? Wenn ja, dann habe ich den eben ergänzt. Meine web.xml sieht jetzt wie folgt aus...funktioniert leider immer noch nicht. Oder meinst du die Provider Klasse, weil das ist die CustomerService.java

Danke
Andy


[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<!-- Default page to serve -->
<welcome-file-list>
<welcome-file>webAdminUds.html</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>CustomerService</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>CustomerService</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<persistence-context-ref>
<persistence-context-ref-name>persistence/em</persistence-context-ref-name>
<persistence-unit-name>CustomerService</persistence-unit-name>
</persistence-context-ref>

</web-app>
[/XML]
 
M

maki

Gast
Er sagte Context und er meinte Context, dass gehört zu den absoluten Servlet bzw. Java WebApps Grundlagen, wenn dir das nix sagt wäre es ganz gut wenn du dich einlesen würdest.
 

Ähnliche Java Themen

Neue Themen


Oben