Java-Getting request.getParameter(“id”)为null

Java-Getting request.getParameter(“id”)为null,java,angularjs,Java,Angularjs,我是Java新手。尝试创建简单的CRUD应用程序。但在DB中添加记录时遇到问题,获取request.getParameter()null。我将jersey用于RESTful Web服务,将Gson用于json数据 请参阅下面的代码 爪哇 安格拉斯 $http({ method : 'POST', url : 'AddResource', data: empObj, headers: { 'Content-Type': 'applic

我是Java新手。尝试创建简单的CRUD应用程序。但在DB中添加记录时遇到问题,获取request.getParameter()null。我将jersey用于RESTful Web服务,将Gson用于json数据

请参阅下面的代码

爪哇

安格拉斯

$http({
        method : 'POST',
        url : 'AddResource',
        data: empObj,
        headers: { 'Content-Type': 'application/json' }
    }).then(function successCallback(response) {
        if(response.data){
            $scope.getEmployee();
        }
    }, function errorCallback(response) {
        console.log("Data not coming");
    });
编辑

@桑托什,正如我在评论中提到的,你可以通过两种方式来做到这一点

方法1::在JS中单独发送参数

       $http({
            method : 'POST',
            url : 'AddResource',
            data: 'id=' + id + 'firstname=' + firstname,
            headers: { 'Content-Type': 'text/plain' }
        }).then(function successCallback(response) {
            if(response.data){
                $scope.getEmployee();
            }
        }, function errorCallback(response) {
            console.log("Data not coming");
        });
然后可以像Java一样提取它们

request.getParameter('id');
request.getParameter('firstname');
String JSON = request.getParameter('empObj');
方法2::在Java中作为对象发送和拆分

       $http({
            method : 'POST',
            url : 'AddResource',
            data: 'empObj=' + empObj,
            headers: { 'Content-Type': 'text/plain' }
        }).then(function successCallback(response) {
            if(response.data){
                $scope.getEmployee();
            }
        }, function errorCallback(response) {
            console.log("Data not coming");
        });
然后可以像Java一样提取对象

request.getParameter('id');
request.getParameter('firstname');
String JSON = request.getParameter('empObj');
使用类似Gson的解析器来解析这个JSON

Gson gson = new Gson();

Employee empObj = gson.fromJson(JSON, Employee.class);

您正在将内容类型设置为
application/json
。各国的文件

以字符串形式返回请求参数的值,如果 参数不存在。请求参数是额外的信息 随请求一起发送。对于HTTP servlet,参数包含在 查询字符串或已发布的表单数据

尝试省略Content-Type参数以使用getParameter(),或者获取请求正文并从此处解析JSON字符串


//编辑:默认为application/json,因此省略内容类型将无效。要对数据进行表单编码,请参见以下问题:

如果您使用的是json数据流,则不能使用
request.getParameter(“firstname”)
对于GetJSON参数,您需要读取原始数据

    protected void doPost(HttpServletRequest request, HttpServletResponse response)   
             throws ServletException, IOException {  
        PrintWriter out = response.getWriter();


StringBuffer strJson = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null) {
                strJson.append(line);
            }

            Employee employee = new GsonBuilder().create().fromJson(strJson.toString(), Employee.class);


        int status=EmployeeDao.add(employee);

        if(status > 0){
            System.out.println("Record added successfully!");
        }else{
            System.out.println("Unable to add record");
        }
        out.close();
} catch(Exception ex) {
}
    }

修改使用angular生成的请求,将对象作为json字符串传递到正文中,如下所示:

employer="{id:1,\"firstname\":\"John\",....}"
在servlet中:

String jsonString = request.getParameter("employer");
Gson gson = new Gson();
Employee empObj = gson.fromJson(jsonString, Employee.class);
您还可以使用pojo或EJB并将其公开为web服务,在我看来,这是一个更简单、更灵活的解决方案

@Stateless
@Path(value = "employer")
@PermitAll
public class EmployerController {
    ... some object or injections

    @Path(value = "insert")
    @Consumes("application/x-www-form-urlencoded")
    @Produces(MediaType.APPLICATION_JSON)
    @POST
    public T create(@FormParam("employer")String entity)throws ValidationException, Exception{
    ObjectMapper mapper = new ObjectMapper();
    ObjectNode j;
    try {
        j = (ObjectNode) mapper.readTree(entity);
        Employer myemp = mapper.readValue(j, Employer.class);
        ...do what you need...
        return myemp;
    } catch(Exception e){
      LOG.log(Level.SEVERE,"Error",e);
      throw e;
    }
}

}
或者以一种更奇特的方式,您可以实现一个“fromString(stringjson)”方法,如下所示

public static MyEmpl fromString(String jsonString) throws IOException{
    ObjectMapper mapper = new ObjectMapper();
    MyEmpl object = mapper.readValue(jsonString, MyEmpl.class);
    return object;
}
然后将前面的方法定义为:

    public T create(@FormParam("employer")MyEmpl entity)throws Exception{

而反序列化程序(例如,wildlfy中的jackson)会做一些神奇的事情

Yes所有参数。例如{“firstname”:“Santosh”,“lastname”:“Shelke”,“id”:123,“phone”:987098,“jobId”:“Software Eng”,“salasy”:98708}甚至System.out.println(request.getParameterMap())也被赋予了空对象。在发送请求时,在Google Chrome调试器中,当您构建了
empObj
对象时,转到控制台并键入
dir(empObj)
,然后按Enter键。然后检查此对象的所有属性。它是否包含
id
属性?它具有所有需要的参数。名字:“Sachin”id:“123”jobId:“87403”姓氏:“S”电话:“0384630”薪水:“20000”谢谢库马尔的回复。但我正在发送一个包含所有参数的对象。@SantoshShelke是的,我知道了,你需要在js或Java中拆分你的对象。Java无法进入您的对象并检查变量id。例如::在js中,您可以执行类似数据的操作:“id=”+id+“name=”+name。或者在java中提取empObj,比如Employee empObj=(Employee)request.getParameter('empObj'),在这种情况下,您需要发送类似Ajax的数据:“empObj=”+empobjb,但我正在发送JSON,所以应该接受它,对吗?使用“id=”获取null+empObj@SantoshShelke检查我的编辑,如果您还有问题,请告诉我。您也可以发送JSON,但由于servlet无法解析它们,因此它们将作为字符串接收。只需将内容类型更改为“内容类型”:“文本/普通”