Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAX-RS Post多个对象_Java_Rest_Jax Rs - Fatal编程技术网

Java JAX-RS Post多个对象

Java JAX-RS Post多个对象,java,rest,jax-rs,Java,Rest,Jax Rs,我有一个方法 @POST @Path("test") @Consumes(MediaType.APPLICATION_JSON) public void test(ObjectOne objectOne, ObjectTwo objectTwo) 现在我知道我可以发布json格式的单个对象,只需将其放入主体中。 但是有可能做多个对象吗?如果是,怎么做?答案是否定的 原因很简单:这与您可以在方法中接收的参数有关。它们必须与请求相关。对吗?因此,它们必须是头、cookie、查询参数、矩阵参数、路径

我有一个方法

@POST
@Path("test")
@Consumes(MediaType.APPLICATION_JSON)
public void test(ObjectOne objectOne, ObjectTwo objectTwo)
现在我知道我可以发布json格式的单个对象,只需将其放入主体中。
但是有可能做多个对象吗?如果是,怎么做?

答案是否定的

原因很简单:这与您可以在方法中接收的参数有关。它们必须与请求相关。对吗?因此,它们必须是头、cookie、查询参数、矩阵参数、路径参数或请求正文。(为了说明整个情况,还有其他类型的参数称为上下文)


现在,当您在请求中接收JSON对象时,您将在请求体中接收它。该请求可能有多少机构?只有一个。因此,您只能接收一个JSON对象。

答案是

原因很简单:这与您可以在方法中接收的参数有关。它们必须与请求相关。对吗?因此,它们必须是头、cookie、查询参数、矩阵参数、路径参数或请求正文。(为了说明整个情况,还有其他类型的参数称为上下文)


现在,当您在请求中接收JSON对象时,您将在请求体中接收它。该请求可能有多少机构?只有一个。因此,您只能接收一个JSON对象。

您不能像Tarlog所解释的那样,在一个POST调用中放置两个单独的对象


无论如何,您可以创建包含前两个对象的第三个容器对象,并在POS调用中传递该对象。

正如Tarlog所解释的,您不能在一个POST调用中放置两个单独的对象


无论如何,您可以创建包含前两个对象的第三个容器对象,并在POS调用中传递该对象。

您不能使用Tarlog正确说明的方法

但是,您可以这样做:

@POST
@Path("test")
@Consumes(MediaType.APPLICATION_JSON)
public void test(List<ObjectOne> objects)
此外,您始终可以将方法与GET参数结合使用:

@POST
@Path("test")
@Consumes(MediaType.APPLICATION_JSON)
public void test(List<ObjectOne> objects, @QueryParam("objectTwoId") long objectTwoId)
@POST
@路径(“测试”)
@使用(MediaType.APPLICATION_JSON)
公共无效测试(列出对象,@QueryParam(“objectTwoId”)长objectTwoId)

您不能使用Tarlog正确说明的方法

但是,您可以这样做:

@POST
@Path("test")
@Consumes(MediaType.APPLICATION_JSON)
public void test(List<ObjectOne> objects)
此外,您始终可以将方法与GET参数结合使用:

@POST
@Path("test")
@Consumes(MediaType.APPLICATION_JSON)
public void test(List<ObjectOne> objects, @QueryParam("objectTwoId") long objectTwoId)
@POST
@路径(“测试”)
@使用(MediaType.APPLICATION_JSON)
公共无效测试(列出对象,@QueryParam(“objectTwoId”)长objectTwoId)

下一种方法通常适用于此类情况:

TransferObject{
反对一反对一;
反对二反对二;
//能手/二传手
}
@职位
@路径(“测试”)
@使用(MediaType.APPLICATION_JSON)
公共无效测试(TransferObject){
//对象。getObejctOne()。。。。
}

下一种方法通常适用于此类情况:

TransferObject{
反对一反对一;
反对二反对二;
//能手/二传手
}
@职位
@路径(“测试”)
@使用(MediaType.APPLICATION_JSON)
公共无效测试(TransferObject){
//对象。getObejctOne()。。。。
}

我也面临着这些问题。也许这会有帮助

@POST
@Path("/{par}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Object centralService(@PathParam("par") String operation, Object requestEntity) throws JSONException {

    ObjectMapper objectMapper=new ObjectMapper();

    Cars cars = new Cars();  
    Seller seller = new Seller();
    String someThingElse;

    HashMap<String, Object> mapper = new HashMap<>(); //Diamond )))

    mapper = (HashMap<String, Object>) requestEntity;

    cars=objectMapper.convertValue(mapper.get("cars"), Cars.class);
    seller=objectMapper.convertValue(mapper.get("seller"), Seller.class);
    someThingElse=objectMapper.convertValue(mapper.get("someThingElse"), String.class);

    System.out.println("Cars Data "+cars.toString());

    System.out.println("Sellers Data "+seller.toString());

    System.out.println("SomeThingElse "+someThingElse);

    if (operation.equals("search")) {
        System.out.println("Searching");
    } else if (operation.equals("insertNewData")) {
        System.out.println("Inserting New Data");
    } else if (operation.equals("buyCar")) {
        System.out.println("Buying new Car");
    }

    JSONObject json=new JSONObject();
    json.put("result","Works Fine!!!");


    return json.toString();

}


*******CARS POJO********@XmlRootElement for Mapping Object to XML or JSON***

@XmlRootElement
public class Cars {
    private int id;
    private String brand;
    private String model;
    private String body_type;
    private String fuel;
    private String engine_volume;
    private String horsepower;
    private String transmission;
    private String drive;
    private String status;
    private String mileage;
    private String price;
    private String description;
    private String picture;
    private String fk_seller_oid;
    } // Setters and Getters Omitted 

*******SELLER POJO********@XmlRootElement for Mapping Object to XML or JSON***

@XmlRootElement
public class Seller {
    private int id;
    private String name;
    private String surname;
    private String phone;
    private String email;
    private String country;
    private String city;
    private String paste_date;
    }//Setters and Getters omitted too


*********************FRONT END Looks Like This******************

$(function(){
$('#post').on('click',function(){
        console.log('Begins');
        $.ajax({
            type:'POST',
            url: '/ENGINE/cars/test',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data:complexObject(),
            success: function(data){
                console.log('Sended and returned'+JSON.stringify(data));
            },
            error: function(err){
                console.log('Error');
                console.log("AJAX error in request: " + JSON.stringify(err, null, 2));
            }
        }); //-- END of Ajax
        console.log('Ends POST');
        console.log(formToJSON());

    }); // -- END of click function   POST


function complexObject(){
    return JSON.stringify({
                "cars":{"id":"1234","brand":"Mercedes","model":"S class","body_type":"Sedan","fuel":"Benzoline","engine_volume":"6.5",
                "horsepower":"1600","transmission":"Automat","drive":"Full PLag","status":"new","mileage":"7.00","price":"15000",
                "description":"new car and very nice car","picture":"mercedes.jpg","fk_seller_oid":"1234444"},
        "seller":{  "id":"234","name":"Djonotan","surname":"Klinton","phone":"+994707702747","email":"email@gmail.com",                 "country":"Azeribaijan","city":"Baku","paste_date":"20150327"},
        "someThingElse":"String type of element"        
    }); 
} //-- END of Complex Object
});// -- END of JQuery -  Ajax
@POST
@路径(“/{par}”)
@产生(MediaType.APPLICATION_JSON)
@使用(MediaType.APPLICATION_JSON)
公共对象centralService(@PathParam(“par”)字符串操作,对象请求实体)抛出JSONException{
ObjectMapper ObjectMapper=新的ObjectMapper();
汽车=新车();
卖方=新卖方();
把东西串起来;
HashMap映射器=新HashMap();//菱形)))
映射器=(HashMap)requestEntity;
cars=objectMapper.convertValue(mapper.get(“cars”)、cars.class);
seller=objectMapper.convertValue(mapper.get(“seller”)、seller.class);
someThingElse=objectMapper.convertValue(mapper.get(“someThingElse”),String.class);
System.out.println(“Cars数据”+Cars.toString());
System.out.println(“卖方数据”+卖方.toString());
System.out.println(“SomeThingElse”+SomeThingElse);
if(operation.equals(“search”)){
System.out.println(“搜索”);
}else if(operation.equals(“insertNewData”)){
System.out.println(“插入新数据”);
}else if(操作等于(“买车”)){
System.out.println(“购买新车”);
}
JSONObject json=新的JSONObject();
put(“结果”,“工作正常!!!”);
返回json.toString();
}
*******CARS POJO******@XmlRootElement用于将对象映射到XML或JSON***
@XmlRootElement
公车{
私有int-id;
自有品牌;
私有字符串模型;
私有字符串体_类型;
私人管柱燃料;
私有字符串引擎\u卷;
私人串马力;
专用字符串传输;
专用字符串驱动器;
私有字符串状态;
私人串里程;
私人字符串价格;
私有字符串描述;
私有字符串图片;
私有字符串fk_seller_oid;
}//省略了setter和getter
*******卖方POJO******@XmlRootElement,用于将对象映射到XML或JSON***
@XmlRootElement
公共类卖家{
私有int-id;
私有字符串名称;
私家姓;
私人电话;
私人字符串电子邮件;
私人国家;
私人城市;
私人字符串粘贴日期;
}//二传手和接球手也被省略了
*********************前端看起来像这样******************
$(函数(){
$('#post')。在('click',function()上{
console.log('Begins');
$.ajax({
类型:'POST',
url:“/ENGINE/cars/test”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
数据:complexObject(),
成功:功能(数据){
log('send and returned'+JSON.stringify(data));
},
错误:函数(err){
console.log('Error');
log(“请求中的AJAX错误
@Provider
public class JacksonJsonParamConverterProvider implements ParamConverterProvider {

    @Context
    private Providers providers;

    @Override
    public <T> ParamConverter<T> getConverter(final Class<T> rawType,
                                              final Type genericType,
                                              final Annotation[] annotations) {
        // Check whether we can convert the given type with Jackson.
        final MessageBodyReader<T> mbr = providers.getMessageBodyReader(rawType,
                genericType, annotations, MediaType.APPLICATION_JSON_TYPE);
        if (mbr == null
              || !mbr.isReadable(rawType, genericType, annotations, MediaType.APPLICATION_JSON_TYPE)) {
            return null;
        }

        // Obtain custom ObjectMapper for special handling.
        final ContextResolver<ObjectMapper> contextResolver = providers
                .getContextResolver(ObjectMapper.class, MediaType.APPLICATION_JSON_TYPE);

        final ObjectMapper mapper = contextResolver != null ?
                contextResolver.getContext(rawType) : new ObjectMapper();

        // Create ParamConverter.
        return new ParamConverter<T>() {

            @Override
            public T fromString(final String value) {
                try {
                    return mapper.reader(rawType).readValue(value);
                } catch (IOException e) {
                    throw new ProcessingException(e);
                }
            }

            @Override
            public String toString(final T value) {
                try {
                    return mapper.writer().writeValueAsString(value);
                } catch (JsonProcessingException e) {
                    throw new ProcessingException(e);
                }
            }
        };
    }
}
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>${jersey-2.x.version}</version>
</dependency>
import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/api")
public class JerseyApplication extends ResourceConfig {

    public JerseyApplication() {
        packages("stackoverflow.jersey");
        register(MultiPartFeature.class);
    }
}
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("foobar")
public class MultipartResource {

    @POST
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response postFooBar(@FormDataParam("foo") Foo foo,
                               @FormDataParam("bar") Bar bar) {
        String response = foo.foo + "; " + bar.bar;
        return Response.ok(response).build();
    }

    public static class Foo {
        public String foo;
    }

    public static class Bar {
        public String bar;
    }
}
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey-2.x.version}</version>
</dependency>
<!DOCTYPE html>
<html ng-app="multipartApp">
    <head>
        <script src="js/libs/angular.js/angular.js"></script>
        <script>
            angular.module("multipartApp", [])
            .controller("defaultCtrl", function($scope, $http) {

                $scope.sendData = function() {
                    var foo = JSON.stringify({foo: "FooFoo"});
                    var bar = JSON.stringify({bar: "BarBar"});

                    var boundary = Math.random().toString().substr(2);                    
                    var header = "multipart/form-data; charset=utf-8; boundary=" + boundary;

                    $http({
                        url: "/api/foobar",
                        headers: { "Content-Type": header }, 
                        data: createRequest(foo, bar, boundary),
                        method: "POST"
                    }).then(function(response) {
                        $scope.result = response.data;
                    });
                };

                function createRequest(foo, bar, boundary) {
                    var multipart = "";
                    multipart += "--" + boundary
                        + "\r\nContent-Disposition: form-data; name=foo"
                        + "\r\nContent-type: application/json"
                        + "\r\n\r\n" + foo + "\r\n";        
                    multipart += "--" + boundary
                        + "\r\nContent-Disposition: form-data; name=bar"
                        + "\r\nContent-type: application/json"
                        + "\r\n\r\n" + bar + "\r\n";
                    multipart += "--" + boundary + "--\r\n";
                    return multipart;
                }
            });
        </script>
    </head>
    <body>
        <div ng-controller="defaultCtrl">
            <button ng-click="sendData()">Send</button>
            <p>{{result}}</p>
        </div>
    </body>
</html>
T[] create(@RequestBody T[] objects) {
for( T object : objects ) {
   service.create(object);
  }
}
import org.apache.cxf.jaxrs.ext.multipart.Multipart;

@POST
@Path("paramTest")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public GenericResult paramTest(
    @Multipart(value = "myData", type=MediaType.APPLICATION_JSON)
        ObjectOne myData,
    @Multipart(value = "infoList", type=MediaType.APPLICATION_JSON)
        ObjectTwo[] infoList);
@Test
public void paramTest()
{
    String payload1 = "" +
        "{ \"name\": \"someName\", \"branch\": \"testBranch\" }";
    String payload2 =
        " [ { \"name\": \"cn\", \"status\": \"ts\" }," +
            "{ \"name\": \"cn2\", \"status\": \"ts2\" } ] ]";
    RestAssured.
    given().
    contentType("multipart/form-data").
        multiPart("myData", payload1, "application/json").
        multiPart("infoList", payload2, "application/json").
    post(String.format("%s/paramTest", API_PATH)).
    then().
    statusCode(HttpStatus.SC_OK).
    contentType(ContentType.JSON).
    body("success", Matchers.equalTo(true));
}