2014-09-25 2 views
1

여러분,이 예제처럼 많은 예제 (사실 모두)가 @ResponseBody를 사용하여 디자인되었음을 발견했습니다 (click here). 그러나 나는 그저 하나의 간단한 일을하는 수많은 겉으로보기에는 상충되는 방법으로 모든 것을 함께 모으는 것처럼 보일 수 없다. 나는 봄에 대한 나의 마지막 사용법이 2.5로 제한되어 있다는 것을 고백하며, 슬프게도, 그것은 저를 마지막 버전만큼 좋게 만듭니다. 프로젝트에 대한 자체 서비스를 작성해야하며 Spring은 분명히 갈 길이 멀다. 이 훌륭한 세트의 예제 (click here)를 사용하여 초기 개념을 정리했으며 모든 것이 Sencha Touch 애플리케이션의 REST 프록시에서 올바르게 작동했습니다. 또는 그래서 나는 생각했다. JSON 페이로드를 PUTing 및 POST하기 전까지. 갑자기 HTTP 요청에서 매핑 된 데이터가 없습니다.JSON 페이로드가 POST에서 구문 분석되지 않음 Spring 4.x MVC

여기 내 컨트롤러입니다. 스프링 4이며 @ReponseBody는 스프링 3에서 사용되었으며 그 기능은 @Controller 대신 @RestController가 사용되도록 위임되었습니다. 스프링 3 그래서 설정 세부 사항은 나 같은 사람, 자바를 잘 이해하지만, 스프링과 같은 프레임 워크에 대한 깊은 경험이없는 사람에게는 그리 스케치가된다. 2.5에서는 구성을위한 XML 동물원 이었기 때문에 "어디서"의 빈을 구성하는지에 대한 자세한 내용을 묻습니다. 이전에 XML 파일에 남겨둔 연관성에 대한 명명 규칙이 이제 규칙처럼 보입니다. 그들은 어느 정도는 과거에 있었지만 지금은 그렇지 않은 것처럼 보입니다. 나는 PARAMS를 데리러이를 얻을 수 있습니다

 @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 상에 요청 PARAMS를 연결하여입니다. 그러나 문제를 확인하는 데 보낸 후, 나는 작동 할 해킹을 취할 것입니다. JSON 페이로드 게시는 양식 변수와 다르기 때문에 필자가 사용했던 테스트 도구는이 문제를 해결하는 데 도움이되지 못했습니다.

이 문제가 있으며이 예외를 겪고있는 사람이 있다면 내 전문가가 여기에 완전하고 시연 된 해결책으로 대답 할 것입니다.

질문 : 잭슨을 사용하여 POST에서 JSON 페이로드를 구문 분석하고 바인딩하는 방법 (PUT은 W3C 권장 사항과 관련하여 동일하게 작동 함) - 차이가 나는 경우 Glassfish 4.0을 사용하고 있습니다.

많은 사람들이 시작하는 "무료"예제를 사용할 때 고려해야 할 사항이 있습니다. 잡았다는 항상 그렇습니다. 나는 항상 서비스를 사용하는 데모 소프트웨어를 제공한다는 것을 의미합니다. 나는이 작업을 할 수 없었고 업데이트가 실제로 이상한 것으로 보이는 가변 패턴을 얻었지만 요청되기 전에 URL에 연결되었음을 발견했습니다. 나는 그것을 지식으로 구현하기 위해 이것을 배우려고 너무 많은 시간을 보냈지만, 제 시간에 그것을 할 수는 없습니다.

이 게시물에 대한 모든 답변에 감사드립니다. 당신은 내 감사를드립니다.

커티스 피셔

나는 더 이상 질문이 아니라 가까운 대답에 저를 선도있게 답변을 받았습니다. 나는 그것을 고맙게 생각하지만, 단지 그 지식의 단편으로 아무것도 구현할 수 없습니다. 여기

<?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> 

이 잘 나는 양 데이비스의 게시물을 편집의 실수를 내가 묻는 질문은 에테르라는 피어 검토에 들어갔다 ... 콩이로드되는 방법이다. 의심의 여지가 일부 위반에 대한 징계를받을거야.

먼저, 귀하와 답변자님께 감사드립니다. 다음 질문은 내가 Ms.데이비스의 예 씨 섬너의 제안에 내장, JSON과 Jave (WellTest) 모두에서 모델 객체는 코드의

MyObject res = myObjectRepository.save(myObject);

라인으로 자동으로 채워 않은 것 같습니다. 이제 이것은 꽤 멋지다. 그러나 나는 몇 가지 더 질문을 ...이

개체의 어떤 종류입니다 ...

@Autowired 
private MyObjectRepository myObjectRepository; 

을 어떻게이에 "유선"입니다

?

@ResponseStatus(HttpStatus.CREATED) 

위의 @ResponseStatus는 무엇에 해당합니까?

Log4J는 무엇을 사용하고 있습니까?

아래 코드에서 두 사람 중 어느 사람이 수정합니까? 내 콩 주석 클래스와 XML 파일을 통해로드되어 있지 않기 때문에

@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; 
} 
} 

마지막으로, 어떤 잭슨 콩 또는 정의에로드 할 필요 개체가? 아니면 다른 구성 세부 사항? 내 질문에 대해 당신 중 한 사람의 말을 듣 자마자이를 구현할 것입니다. 잠시 두 분 중 한 사람의 말을 듣지 못한다면, 나는 Mr. Davis의 @autoWired 부분을 구현하는 방법을 모르기 때문에 Sumner의 해결책의 변형을 시도 할 것입니다. 나는 준비 됐어!

는 모두 감사합니다 ... 당신은 문제가 실제로 무엇인지에 대한 명확한 표시를 제공하지 않았기 때문에

커티스 피셔

+0

귀하의 질문에 이해가 가지 않습니다. 클래스 패스에 Jackson 라이브러리가 있고 서블릿 컨텍스트'@Configuration' 클래스에서 디폴트'@ EnabledWebMvc'를 사용한다면,'@ Controller' 핸들러 메소드 인 POJO 타입 매개 변수에'@ RequestBody'라는 주석을 달기 만하면됩니다. 요청 본문을 POJO로 역 직렬화합니다. –

+0

답변을받지 못했으며 댓글 만 받았습니다. 질문이 너무 광범위하기 때문에 답변을받지 못했습니다. 당신은 하나의 문제에 초점을 맞추고, 진술하고, 시도한 것을 진술해야합니다. 당신은 이메일을 쓰지 않고 _a_ 질문을하고 있습니다. http://stackoverflow.com/help/how-to-ask –

답변

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; 
    } 
} 
+0

Summers 씨에게 제공 해줘서 고맙습니다. Davis의 대답을 편집하여 두 사람 모두에게 답장을하는 것이 실수였습니다. 그것은 누군가가 그것을 읽을 수 있기 전에 동료 리뷰를위한 것입니다. 다른 누군가는 아마도 내가 제대로하지 않는다고 말할 것입니다 - 포럼. 나는 이것에 관해 더 잘할 것이다, 나는 약속한다. 연습이 필요합니다! 또한, "Parse"라는 작품을 사용하여 제 문제를 묘사 한 것을 매우 기쁘게 생각합니다. 분명하지 않더라도주의를 기울였습니다 ... 다시 한번 감사드립니다! –

+0

나는 당신의 예를 사용했고 완벽하게지도를 작성했습니다. 나는이 개념을 계속할 필요가있다 Sencha Application. 두 분 모두 고마워요. 제가 필요한 것입니다. –

0

이것은 POST 요청을 처리하기 위해 RestController를 사용하는 예입니다. 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; 
    } 
}