2013-02-07 29 views
7

Tôi đang làm việc trên dịch vụ web an toàn của Java. Trong khi thử nghiệm dịch vụ an toàn, tôi nhận được câu trả lời đúng cho các phương thức GET và DELETE nhưng nó không làm việc cho các phương thức POST và PUT. Ai giúp tôi với? Tôi đã viết đoạn mã sau:Trạng thái HTTP 415 - Loại phương tiện không được hỗ trợ

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

Và bạn thử nghiệm nó như thế nào? Đó là vấn đề với người đưa ra yêu cầu, không phải với dịch vụ. – Esailija

+0

Thông tin của bạn là gì? – Fildor

+0

i m bằng cách sử dụng netbeans IDE để có sẵn công cụ để kiểm tra dịch vụ an toàn. –

Trả lời

7

Hãy chắc chắn rằng bạn thiết lập Content-Type: application/xml trong tiêu đề về yêu cầu của bạn.

Tôi không biết làm thế nào nó được thực hiện với NetBeans nhưng nó là khá đơn giản để làm điều này với RESTClient.

2

lỗi của tôi là

InboundJaxrsResponse {{ClientResponse method = POST, uri = "http: // localhost: 8080/test/mypath", status = 415, lý do không được hỗ trợ = Media Type}}

Thêm phụ thuộc sau đây trong pom.xml giải quyết vấn đề của tôi:

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

MyModelClass có họ và tên thuộc tính

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

Đăng như thế này trong lớp kiểm tra.

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

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

nếu bạn POST hoặc PUT một số dữ liệu vui lòng đăng ký JacksonProvider và 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

đây là trong tomcat? hoặc thủy tinh? –

+0

Máy chủ HTTP Jetty – ethemsulan

0

Tôi đã có vấn đề này rất giống nhau chỉ là bây giờ ...
Giải pháp của tôi là để loại bỏ các nhà xây dựng với các thông số.
Trong trường hợp của bạn: xóa

public Students(Integer rollno) { 
    this.rollno = rollno; 
} 
Các vấn đề liên quan