我正在研究Java restful web服务。在测试restful服务时,我得到的响应对于GET和DELETE方法是正确的,但它不适用于POST和PUT方法。谁能帮我?我写了以下代码:
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 + " ]";
}
}
答案 0 :(得分:8)
请务必在请求的标头中设置Content-Type: application/xml
。
我不知道如何使用NetBeans完成它,但使用RESTClient执行此操作非常简单。
答案 1 :(得分:2)
我的错误是
InboundJaxrsResponse {ClientResponse {method = POST,uri =&#34; http:// localhost:8080 / test / mypath&#34;,status = 415,reason = Unsupported Media Type}}
在pom.xml
中添加以下依赖项解决了我的问题:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.1</version>
</dependency>
MyModelClass
有姓名和姓氏属性
@POST
@Path("mypath")
@Consumes(MediaType.APPLICATION_JSON)
public Response convertToObject(MyModelClass modelClass){}
在测试课上发布这样的内容。
String entity = "{\"name\":\"My Name\", \"surname\":\"My Surname\"}"
request().post(Entity.json(entity)
如果你发布或发布一些数据,请注册JacksonProvider和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");
}
}
答案 2 :(得分:0)
我刚才遇到同样的问题...... 我的解决方案是使用参数删除构造函数 在您的情况下:删除
public Students(Integer rollno) {
this.rollno = rollno;
}