2013-02-07 13 views
7

Pracuję nad restrykcyjnym serwisem Java. Podczas testowania restful service otrzymuję odpowiedzi prawidłowe dla metod GET i DELETE, ale nie działa ono dla metod POST i PUT. Czy ktoś może mi pomóc? Napisałem następujący kod:Stan HTTP 415 - Nieobsługiwany typ nośnika

StudentService.java

@Stateless 
@Path("students") 
public class StudentService extends StudentServiceLocal<Students> { 
    @PersistenceContext(unitName = "RestFulAPIPU") 
    private EntityManager em; 

    public StudentsFacadeREST() { 
     super(Students.class); 
    } 

    @POST 
    @Override 
    @Consumes({"application/xml", "application/json"}) 
    public String create(Students entity) { 
     return(super.create(entity)); 
    } 

    @PUT 
    @Override 
    @Consumes({"application/xml", "application/json"}) 
    public String edit(@PathParam("id") Students entity) { 
     return(super.edit(entity)); 
    } 

    @DELETE  
    @Path("{id}") 
    public String remove(@PathParam("id") Integer id) { 
     return(super.remove(super.find(id))); 
    } 

    @GET 
    @Path("{id}") 
    @Produces({"application/xml", "application/json"}) 
    public Students find(@PathParam("id") Integer id) { 
     return super.find(id); 
    } 

    @GET 
    @Override 
    @Produces({"application/xml", "application/json"}) 
    public List<Students> findAll() { 
     return super.findAll(); 
    } 

    @GET 
    @Path("{from}/{to}") 
    @Produces({"application/xml", "application/json"}) 
    public List<Students> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { 
     return super.findRange(new int[]{from, to}); 
    } 

    @GET 
    @Path("count") 
    @Produces("text/plain") 
    public String countREST() { 
     return String.valueOf(super.count()); 
    } 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

} 

StudentServiceLocal.java

public abstract class AbstractFacade<T> { 
    private Class<T> entityClass; 

    public AbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public String create(T entity) { 
     getEntityManager().persist(entity); 
     return "inserted"; 
    } 

    public String edit(T entity) { 
      getEntityManager().merge(entity); 
     return "Updated"; 
    } 

    public String remove(T entity) { 
     getEntityManager().remove(getEntityManager().merge(entity));   
      return "deleted"; 
    } 

    public T find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

    public List<T> findAll() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
    } 

    public List<T> findRange(int[] range) { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     q.setMaxResults(range[1] - range[0]); 
     q.setFirstResult(range[0]); 
     return q.getResultList(); 
    } 

    public int count() { 
     javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     javax.persistence.criteria.Root<T> rt = cq.from(entityClass); 
     cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
     javax.persistence.Query q = getEntityManager().createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } 

} 

Students.java

@Entity 
@Table(name = "students") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Students.findAll", query = "SELECT s FROM Students s"), 
    @NamedQuery(name = "Students.findByRollno", query = "SELECT s FROM Students s WHERE s.rollno = :rollno"), 
    @NamedQuery(name = "Students.findByName", query = "SELECT s FROM Students s WHERE s.name = :name")}) 
public class Students implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "rollno") 
    private Integer rollno; 
    @Size(max = 20) 
    @Column(name = "name") 
    private String name; 

    public Students() { 
    } 

    public Students(Integer rollno) { 
     this.rollno = rollno; 
    } 

    public Integer getRollno() { 
     return rollno; 
    } 

    public void setRollno(Integer rollno) { 
     this.rollno = rollno; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (rollno != null ? rollno.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Students)) { 
      return false; 
     } 
     Students other = (Students) object; 
     if ((this.rollno == null && other.rollno != null) || (this.rollno != null && !this.rollno.equals(other.rollno))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "com.ikanksha.rest.entity.Students[ rollno=" + rollno + " ]"; 
    } 

} 
+1

A jak ty sprawdzając je? To problem z osobą, która zgłasza żądanie, a nie z usługą. – Esailija

+0

Jaka jest Twoja intput? – Fildor

+0

Korzystam z IDE dla netbeans, więc istnieje dostępne narzędzie do testowania usługi restful. –

Odpowiedz

7

mieć pewność, że zestaw Content-Type: application/xml w nagłówkach Twojej prośby.

Nie wiem, jak to zrobić z NetBeans, ale jest to dość proste, aby to zrobić z RESTClient.

2

Mój błąd jest

InboundJaxrsResponse {ClientResponse {method = POST, uri = "http: // localhost: 8080/test/mojasciezka", status = 415, powodem = nieobsługiwany Typ nośnika}}

Dodanie następującego zależność w pom.xml rozwiązać mój problem:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.22.1</version> 
</dependency> 

MyModelClass ma imię i nazwisko właściwości

@POST 
@Path("mypath") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response convertToObject(MyModelClass modelClass){} 

Opublikuj w ten sposób w klasie testowej.

String entity = "{\"name\":\"My Name\", \"surname\":\"My Surname\"}" 

request().post(Entity.json(entity) 

jeśli POST lub PUT niektórych danych należy zarejestrować JacksonProvider i JacksonFeature

class TestRestApplication extends ResourceConfig { 

    public TestRestApplication() { 
     packages(true, "com.your_app_package"); 
     register(JacksonProvider.class); 
     register(JacksonFeature.class); 
     property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true"); 
    } 

} 
+0

to jest w tomcat? czy glassfish? –

+0

Jetty serwer HTTP – ethemsulan

0

miałem ten sam problem tylko bardzo teraz ...
Moje rozwiązanie było usunięcie konstruktora z parametrami.
W twoim przypadku: usunąć

public Students(Integer rollno) { 
    this.rollno = rollno; 
} 
Powiązane problemy