在POST Spring 4.x MVC上没有解析JSON Payload

时间:2014-09-25 14:02:24

标签: json spring spring-mvc sencha-touch-2

伙计们,我发现许多例子(实际上都是)都是围绕使用@ResponseBody设计的,就像这篇文章一样(click here)。然而,我似乎无法将所有这些看起来相互矛盾的方式放在一起做一件简单的事情。我承认,我对Spring的最后一次使用仅限于2.5,遗憾的是,这使我的版本与上一版本一样好。我必须为项目编写自己的服务,而Spring显然是要走的路。我使用了这组优秀的例子(click here)来整理最初的概念,并且我的Sencha Touch应用程序中的REST代理工作正常。或者我想。直到我开始将JSON有效负载PUTing并POST到Controller。突然间,HTTP请求中没有映射数据。

这是我的控制器,请记住这是Spring 4,根据我所读的内容,在Spring 3中使用了@ReponseBody,并且由于使用了@RestController而不是SpringCon的@Controller,因此该功能被委托了。所以配置细节对于像我这样的人来说是粗略的,他对Java有很好的把握,但对Spring这样的框架没有深入的经验。我问你关于“where”bean的配置细节,因为有了2.5,它是一个用于配置的XML动物园。现在,对于之前留给XML文件的关联,命名约定似乎是一个规则。它们在某种程度上过去了,但现在看起来并不像现在这样。

     @RequestMapping(value = "/create/{wellTestID}", method = RequestMethod.POST,headers="Accept=application/json")
     public List<WellTest> getWellTestByWellTestID(@PathVariable Long wellTestID, 
             @RequestParam(defaultValue = "99999")  Long wellFacilityID, 
             @RequestParam(defaultValue = "101")    int operatorPersonID, 
             @RequestParam(defaultValue = "67845")  int durationSeconds, 
             @RequestParam(defaultValue = "100")    long grossRate, 
             @RequestParam(defaultValue = "400")    long waterCut, 
             @RequestParam(defaultValue = "30")     long percentGas, 
             @RequestParam(defaultValue = "500")    long temperature, 
             @RequestParam(defaultValue = "60")     long flowLinePressure, 
             @RequestParam(defaultValue = "50")     long casingPressure, 
             @RequestParam(defaultValue = "0")      int allocation, 
             @RequestParam(defaultValue = "3")      int wellTestTypeID,  
             @RequestParam(defaultValue = "you")    String createUser,
             @RequestParam(defaultValue = "me-me")  String lastModifiedUser,
             @RequestParam(defaultValue = "1-1-2014") String startDate, 
             @RequestParam(defaultValue = "1-1-2014") String createDate, 
             @RequestParam(defaultValue = "1-1-2014") String lastModifiedDate, 
             WellTest wellTest) throws ParseException {
         wellTestService.createWellTest(wellTest);
      List<WellTest> wt = wellTestService.getWellTestByWellTestID(wellTestID);
      return wt;
     }

我可以通过将请求参数连接到URL来解决这个问题,这是我们都知道错误的唯一方法。但是在花了几天时间确定问题之后,我会采取任何可行的方法。我使用的测试工具确实无法帮助我为这个问题做好准备,因为POST一个JSON有效负载与表单变量不同。

所以这就是问题所在,如果有人遇到这种异常现象,我希望专家会在这里回复一个完整且经过验证的解决方案。

问题是:如何使用Jackson在POST上解析和绑定JSON有效负载(PUT在W3C建议方面的工作方式相同) - 如果有所不同,我正在使用Glassfish 4.0。

当我们许多人开始使用这些“免费”示例时,我有一个让人们考虑的问题。问题总是,我的意思是,总是运行任何使用服务的演示软件。在我无法完成这项工作之后我发现这些更新实际上是GET的变量模式,我觉得很奇怪,但在请求之前它被连接到URL。我花了太多时间来学习这个用知识来实现​​它,但我无法及时做到。

感谢关于这篇文章的所有答案。你有我的感激之情。

Curtis Fisher

我收到了一个答案,提出了更多问题,而不是让我更接近答案。我很感激,但我无法用那段知识实现任何东西。

以下是如何加载bean ...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org /2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans     
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.aspecteg.springservice.controller" />
<mvc:annotation-driven />
</beans>

好吧,我犯了编辑戴维斯女士的帖子的错误,我问过的问题进入了名为Peer Review的以太网。毫无疑问,我会因为某些违规行为而受到抨击。

首先,我要感谢你和萨姆纳先生的回答。我的下一个问题是因为我注意到戴维斯女士的例子建立在萨姆纳先生的建议之上,看来JSON和Jave(WellTest)中的模型对象是由

自动填充的。

MyObject res = myObjectRepository.save(myObject);

代码行。现在看起来很酷。不过我还有一些问题......

是什么类型的对象...

 @Autowired
private MyObjectRepository myObjectRepository;

如何“连线”?

@ResponseStatus(HttpStatus.CREATED)

上面负责的@ResponseStatus是什么?

您正在使用的Logger是什么,Log4J?

鉴于下面的代码,你们中的任何一个都有任何更正吗?

@RestController
@RequestMapping("/service/welltest")
public class WellTestController {

private static Logger LOG = LoggerFactory.getLogger(MyObjectsController.class);

@Autowired
private MyObjectRepository myObjectRepository; //NEED MORE INFO ON THIS - Curtis

@RequestMapping(value = "/update/{wellTestID}",  method = RequestMethod.PUT,headers="Accept=application/json",
                     consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public WellTest createUserPayment(@RequestBody WellTest wellTest) {
    WellTest wt = myObjectRepository.save(wellTest);
    LOG.info("the result of the save: "+wt.toString());
    return res;
}
}

最后,由于我的bean是通过xml文件加载而不是带注释的类,因此是否需要在定义中加载任何Jackson bean或对象?或任何其他配置细节?一旦我从你们两个人那里听到我的问题,我就会实施这个。如果我暂时没有收到你们两个人的消息,我会尝试一下萨姆纳先生的解决方案,因为我不知道如何实施戴维斯女士的@autoWired部分。我准备好了!

谢谢你们两个......

Curtis Fisher

2 个答案:

答案 0 :(得分:2)

我不完全理解您的问题,因为您没有明确说明问题究竟是什么。话虽如此,以下应该可以正常工作:

@RestController
class FooController {
  @RequestMapping(
    value = "/some/endpoint",
    method = RequestMethod.POST,
    consumes = MediaType.APPLICATION_JSON_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE
  )
  public MyResponseObject someEndpoint(@RequestBody MyRequestObject requestBody)
  {
    MyResponseObject responseObject = new MyResponseObject();
    responseObject.setSomeProperty("foo");
    responseObject.setAnotherProperty(responseObject.getSomeProperty("bar"));

    return responseObject;
  }
}

答案 1 :(得分:0)

这是使用RestController处理POST请求的示例。您的JSON只需包含MyObject类中所需的字段。如果您需要进一步澄清,请与我们联系。

@RestController
@RequestMapping(value = "/myPath")
public class MyObjectsController {

    private static Logger LOG = LoggerFactory.getLogger(MyObjectsController.class);

    @Autowired
    private MyObjectRepository myObjectRepository;

    @RequestMapping(value = "", method = POST)
    @ResponseStatus(HttpStatus.CREATED)
    public MyObject createUserPayment(@RequestBody MyObject myObject) {
        MyObject res = myObjectRepository.save(myObject);
        LOG.info("the result of the save: "+res);
        return res;
    }
}