有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个自定义对象的java@Restcontroller方法

我有一个弹簧控制器

@RestController
public class TestController {

    @RequestMapping("/checkTestObject")
    public MyPOJOObject3 checkTestObject(MyPOJOObject1 obj1, MyPOJOObject2 obj2) {
        //Using obj1 and obj2 - business logic
        return new MyPOJOObject3();
    }
}

其中,MyPOJOObject1、MyPOJOObject2和MyPOJOObject3是我用setter和getter字段定义的3个自定义对象。我试过的客户是

public class TestClient(
    public static void main(String args[]){

        MyPOJOObject1 obj1 = new MyPOJOObject1();
        obj1.setInfoChgDate(new Date());
        obj1.setInfoRegUserName("NEW_USER");
        MyPOJOObject2 obj2 = new MyPOJOObject2();
        obj2.setId(121l);
        obj2.setDescription("Hello TestDemo");

        String url = "http://localhost:8080/TestApp/checkTestObject";
        MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();
        formData.set("obj1", obj1);
        formData.set("obj2", obj2);
        // Prepare acceptable media type
        List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
        acceptableMediaTypes.add(MediaType.ALL);
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(acceptableMediaTypes);
        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(formData, headers);
        ResponseEntity<MyPOJOObject3> response = null;
        try {
            response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, MyPOJOObject3.class);
            logger.debug(url + " :: response :: " + response.toString());
        } catch (Exception exception) {
            logger.error(url + " :: Exception thrown :: ", exception);
        }
        //response.getBody();
    }
)

当我在tomcat上部署RestController并运行客户端时,我得到的错误是

2015-07-27 14:54:47,230 [main] ERROR TestController - http://localhost:8080/TestApp/checkTestObject :: Exception thrown :: 
org.springframework.web.client.HttpClientErrorException: 405 Method Not Allowed
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:607)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:565)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:521)

我的问题是,这是使用Spring通过REST发送和接收自定义对象的正确方法,还是有其他方法?我尝试使用其他RestTemplate方法,如getForObject、postForObject、postForLocation等,但没有成功。请告诉我是否有任何通过JSON通过REST发送接收复杂对象的标准方法,或者我必须采用类似-convert object to JSON string-send over-convert back JSON string to object的方式,反之亦然。请让我知道的选择,因为我与我的工作在这里罢工

谢谢


共 (2) 个答案

  1. # 1 楼答案

    405 Method Not Allowed
    

    这意味着您正在尝试POST到一个不是POST的方法@RequestMapping默认方法是GET。将控制器代码更改为以下代码

    更新

    @RestController
    public class TestController {
    
        @RequestMapping(value="/checkTestObject", method=RequestMethod.POST)
        public MyPOJOObject3 checkTestObject(@RequestParam MyPOJOObject1 obj1, @RequestParam MyPOJOObject2 obj2) {
            //Using obj1 and obj2 - business logic
            return new MyPOJOObject3();
        }
    }
    

    要修复400错误请求错误,需要在obj1和obj2之前添加@RequestParam。因为您将这些作为formdata的一部分发送。请参阅以上代码

  2. # 2 楼答案

    使用@RequestBody

    @RestController 公共类TestController{

    @RequestMapping(value="/checkTestObject", method=RequestMethod.POST)
    public MyPOJOObject3 checkTestObject(@RequestBody MyPOJOObject1 obj1, @RequestBody MyPOJOObject2 obj2) {
            //Using obj1 and obj2 - business logic
            return new MyPOJOObject3();
        }
    }