带泽西的JAX-RS:将表单参数传递给PUT方法以更新资源

时间:2011-05-11 12:21:48

标签: java rest jaxb jersey jax-rs

我必须更新具有firstName和lastName的Person记录。用户应该能够从html表单更改它,并在提交时应该更新。

这是我的代码。

    @PUT
    @Path("/{userId}")
    public Response updatingResource(@FormParam("firstName") String firstName, @FormParam("lastName ") String lastName , @PathParam("userId") String userId){
        System.out.println(firstName);
        System.out.println(lastName);
        return Response.ok().build();
    }

SOP语句打印为null。我一直在使用Mozilla Firefox的Poster插件发送PUT请求。

我也试过用@Consumes(MediaType.APPLICATION_FORM_URLENCODED)注释它,但它仍然为每个值打印null。

如何编写和调用接收这三个值的PUT方法。我偶然发现并发现有人要求使用JSON或XML。我该如何使用JSON?如果有人帮助我编写REST方法来更新资源,我会非常感激


如果我使用Firefox的RESTClient和Google的rest-client发送PUT请求,我可以获取表单参数。这个工具都有像我放置firstName=Amit&lastName=Patel的身体部分。我还将标题Content-Type添加为application/x-www-form-urlencoded。我认为Firefox的Poster是错误的。任何人都可以建议我有任何其他方式我应该验证代码或我可以信任前两个REST客户端吗?

3 个答案:

答案 0 :(得分:7)

除了使用@Consumes(MediaType.APPLICATION_FORM_URLENCODED)为您的方法添加注释外,您还必须将application/x-www-form-urlencoded作为内容类型发送。你做到了吗?

已编辑:您只能将POSTParams用于POST:

  

SRV.4.1.1参数可用时以下是   填写表格后数据之前必须满足的条件   参数集:

     
      
  1. 请求是HTTP或HTTPS请求。
  2.   
  3. HTTP方法是POST。
  4.   
  5. 内容类型为application / x-www-form-urlencoded。
  6.   
  7. servlet已对请求对象上的任何getParameter方法系列进行了初始调用。如果不符合条件   并且帖子表单数据不包含在参数集中   数据必须仍然可以通过请求对象对servlet可用   输入流。如果满足条件,则不再发布表单数据   可以直接从请求对象的输入中读取   流。
  8.   

答案 1 :(得分:1)

或者,您可以使用Overwrite HTTP method with JAX-RS

中指示的方法

您基本上会添加一个隐藏的参数/ HTTP标头,然后POST表单。在您的servlet中,您预先添加一个Filter来检查某个头/隐藏表单元素,并将POST更改为PUT请求。这将转发到您的资源,并在使用PUT注释时正确使用。

答案 2 :(得分:1)

PUT不接受FormParameters是不正确的。我成功地使用@FormParam和PUT。也许是@PathParam。我没试过。

似乎也不需要特殊的注释。这是我的申请中的一个工人阶级:

package ch.sertal.vision.server.services.objectstore;

import ch.sertal.vision.dao.FormDao;
import ch.sertal.vision.dao.PrepopContentDao;
import ch.sertal.vision.model.Form;
import ch.sertal.vision.model.PrepopContent;
import ch.sertal.vision.model.User;
import ch.sertal.vision.model.exceptions.NotLoggedinException;
import ch.sertal.vision.server.services.AbstractSertalService;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
import java.util.Set;

@Path( "jsonrest/prepop" )
public class PrepopContentStore extends AbstractSertalService {

   @GET
   @Path( "list" )
   @Produces( "application/json" )
   public Response getPrepopEntries( @QueryParam( "formId" ) Long formId ) {
      User user;
      try {
         user = getUser();
      } catch ( NotLoggedinException e ) {
         return Response.status( Response.Status.UNAUTHORIZED ).build();
      }

      PrepopContentDao prepopContentDao = new PrepopContentDao( db );
      List<PrepopContent> contentList = prepopContentDao.list( user, formId );

      JSONArray jsPrepops = new JSONArray();
      for ( PrepopContent content : contentList ) {
         jsPrepops.add( prepopContentDao.getJsContent( content, user ) );
      }

      return Response.ok( jsPrepops.toJSONString(), MediaType.APPLICATION_JSON_TYPE ).build();
   }

   @PUT
   @Produces( "application/json" )
   public Response newPrepopContent( @FormParam( "formId" ) Long formId ) {
      User user;
      try {
         user = getUser();
      } catch ( NotLoggedinException e ) {
         return Response.status( Response.Status.UNAUTHORIZED ).build();
      }

      Form form = (new FormDao( db)).get( formId );

      PrepopContent content = new PrepopContent( form, "" );
      content.setTenant( user.getMainTenant() );
      PrepopContentDao prepopContentDao = new PrepopContentDao( db );
      content = prepopContentDao.save( content );

      return Response.ok( prepopContentDao.getJsContent( content, user ).toJSONString(),
                  MediaType.APPLICATION_JSON_TYPE ).build();
   }

}

从jQuery调用它是这样的:

    $.ajax( {
       url:"${pageContext.request.contextPath}/services/jsonrest/prepop",
       type:"PUT",
       async:true,
       data: [{name: "formId", value: that.formId}],
       success:function ( prepopContent ) {
          listContainer.append( "<div>" + template( prepopContent ) + "</div>" );
       }
    } );

$ {pageContext.request.contextPath}来自JSP