2

참고 :SSCCEmy GitHub repo here에서이 문제를 정확하게 재생합니다. 로컬 단지 그것을 실행하려면 :JSON 데이터를 반환하지 않는 Spring Boot RestController

  1. 복제 그것은
  2. ./gradlew clean build
  3. java -Dspring.config=. -jar build/libs/bootup.jar
  4. 브라우저를 열고

기본적으로

나는 봄 부팅 응용 프로그램을 http://localhost:9200/cars/1에 (그루비로 작성)에 CarController :

각각
@Slf4j 
@RestController 
@RequestMapping(value = "/cars") 
class CarController { 
    // Mock for an actual DB 
    static Map<Long,Car> carDb 
    static { 
     carDb = new HashMap<Long,Car>() 

     carDb.put(1, new Car(
      1, UUID.fromString("d3bdc4ea-4c62-4bd2-a751-681a531f34f4"), 
      new CarType(10, UUID.fromString("ba4dc4ea-4c62-4bd2-a751-681a531f3487"), "Sedan", "SEDAN"), 
      "Toyota", "Corolla") 
     ) 
     carDb.put(2, new Car(
      2, UUID.fromString("45a148b9-a44b-41c2-8ad4-c3b5069f091a"), 
      new CarType(11, UUID.fromString("b68148b9-a44b-41c2-8ad4-c3b5069f0922"), "Sport Utility Vehicle", "SUV"), 
      "Honda", "CRV") 
     ) 
     carDb.put(3, new Car(
      3, UUID.fromString("fe9ede26-886a-4bd9-9b09-535387fffe88"), 
      new CarType(12, UUID.fromString("5a5ede26-886a-4bd9-9b09-535387fffe10"), "Truck", "TRUCK"), 
      "Chevy", "Silverado") 
     ) 
    } 

    @RequestMapping(value = "/{carId}", method = RequestMethod.GET) 
    Car getCarById(@PathVariable(value = "carId") Long carId) { 
     carDb.get(carId) 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    void createCar(@RequestBody Car car) { 
     log.info("Received a car: ${car}") 
    } 
} 

경우 CarCarType은 다음과 같습니다

@Canonical 
abstract class BaseEntity { 
    Long id 
    UUID refId 
} 

@Canonical 
@TupleConstructor(includeSuperProperties = true) 
@ToString(includeSuperProperties = true) 
class Car extends BaseEntity { 
    CarType type 
    String make 
    String model 
} 

@Canonical 
@TupleConstructor(includeSuperProperties = true) 
@ToString(includeSuperProperties = true) 
class CarType extends BaseEntity { 
    String name 
    String label 
} 

내가 여기에 봄 부팅 액추에이터를 사용하고있어하는 내가 당기는거야 종속성 :

compile(
    'org.codehaus.groovy:groovy-all:2.4.6' 
    ,'org.springframework.boot:spring-boot-starter-actuator' 
    ,'org.springframework.boot:spring-boot-starter-jetty' 
    //,'org.springframework.boot:spring-boot-starter-security' 
//  ,'org.springframework.boot:spring-boot-starter-thymeleaf' 
    ,'org.apache.commons:commons-lang3:3.4' 
    ,'ch.qos.logback:logback-parent:1.1.7' 
) 
compile('org.springframework.boot:spring-boot-starter-web') { 
    exclude module: 'spring-boot-starter-tomcat' 
} 

dev('org.springframework.boot:spring-boot-devtools') 

나는이 프로그램을 실행할 때 (위에 언급 된 단계를 사용하여) 그것은 잘 시작됩니다. 그런 다음 브라우저를 열고 http://localhost:9200/cars/1 (CarcarDb의 JSON 페이로드로 되 돌리길 원하지만 아무 것도 반환되지 않습니다. 나는 그 요청을 검색 할 때 로그, 난을 참조하십시오

2017-04-08 05:06:58.668 DEBUG 31573 --- [tp1164253047-17] o.s.web.servlet.DispatcherServlet  : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/cars/1] 
2017-04-08 05:06:58.675 DEBUG 31573 --- [tp1164253047-17] s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /cars/1 
2017-04-08 05:06:58.678 DEBUG 31573 --- [tp1164253047-17] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public hotmeatballsoup.bootup.model.Car hotmeatballsoup.bootup.controllers.CarController.getCarById(java.lang.Long)] 
2017-04-08 05:06:58.678 DEBUG 31573 --- [tp1164253047-17] o.s.web.servlet.DispatcherServlet  : Last-Modified value for [/cars/1] is: -1 
2017-04-08 05:06:58.751 DEBUG 31573 --- [tp1164253047-17] o.s.web.servlet.DispatcherServlet  : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 
2017-04-08 05:06:58.751 DEBUG 31573 --- [tp1164253047-17] o.s.web.servlet.DispatcherServlet  : Successfully completed request 
2017-04-08 05:06:58.774 DEBUG 31573 --- [tp1164253047-21] o.s.web.servlet.DispatcherServlet  : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/favicon.ico] 
2017-04-08 05:06:58.774 DEBUG 31573 --- [tp1164253047-21] o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/favicon.ico] are [/**/favicon.ico] 
2017-04-08 05:06:58.775 DEBUG 31573 --- [tp1164253047-21] o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/favicon.ico] are {} 
2017-04-08 05:06:58.775 DEBUG 31573 --- [tp1164253047-21] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/favicon.ico] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], class path resource []], resolvers=[[email protected]2dfeae]]] and 1 interceptor 
2017-04-08 05:06:58.776 DEBUG 31573 --- [tp1164253047-21] o.s.web.servlet.DispatcherServlet  : Last-Modified value for [/favicon.ico] is: -1 
2017-04-08 05:06:58.781 DEBUG 31573 --- [tp1164253047-21] o.s.web.servlet.DispatcherServlet  : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 
2017-04-08 05:06:58.781 DEBUG 31573 --- [tp1164253047-21] o.s.web.servlet.DispatcherServlet  : Successfully completed request 

내가 그 로그를 해석하는 방법을 잘 모르겠지만, 봄 부팅 HTML에 대한 요청과 같은이 치료를 위해 노력하고있다처럼 내가 (웹 페이지를 느낀다) 데이터가 아니라 JSON 기반 REST 데이터를 제공합니다.

그래서 내가 물어

{ 
    "id" : 1, 
    "refId" : "d3bdc4ea-4c62-4bd2-a751-681a531f34f4", 
    "type" : { 
    "id" : 10, 
    "refId" : "ba4dc4ea-4c62-4bd2-a751-681a531f3487", 
    "name" : "Sedan", 
    "label" : "SEDAN" 
    } 
    "make" : "Toyota", 
    "model" : "Corolla" 
} 

어떤 아이디어 : 나는 http://localhost:9200/cars/1에 GET 요청이 JSON 같은 아마 뭔가를 반환하도록 어떻게해야합니까? 미리 감사드립니다!

+0

'Content-Type' http 헤더를 설정하려고 했습니까? – dynamo

답변

4

문제는 car.get(carId)이 (는) null을 반환합니다. 문제는지도입니다

static Map<Long,Car> carDb = [(1l): new Car(
      1, UUID.fromString("d3bdc4ea-4c62-4bd2-a751-681a531f34f4"), 
      new CarType(10, UUID.fromString("ba4dc4ea-4c62-4bd2-a751-681a531f3487"), "Sedan", "SEDAN"), 
      "Toyota", "Corolla"), 
     (2l): new Car(
      2, UUID.fromString("45a148b9-a44b-41c2-8ad4-c3b5069f091a"), 
      new CarType(11, UUID.fromString("b68148b9-a44b-41c2-8ad4-c3b5069f0922"), "Sport Utility Vehicle", "SUV"), 
      "Honda", "CRV"), 
     (3l): new Car(
      3, UUID.fromString("fe9ede26-886a-4bd9-9b09-535387fffe88"), 
      new CarType(12, UUID.fromString("5a5ede26-886a-4bd9-9b09-535387fffe10"), "Truck", "TRUCK"), 
      "Chevy", "Silverado") 
    ] 
+0

Uggghhhh 덕분에 @dynamo (+1) - 그 일을했습니다. 내 정적 초기화 프로그램이'carDb' 맵에서 작동하지 않는 이유에 대한 아이디어가 있습니까? 정적 초기화 블록을 수행하는 "그루비"방식인가요? 다시 한 번 감사드립니다! – smeeb

+0

사실 정적 인 초기화 도구로 문제가 발생하지 않았습니다. 정수로 초기화하는지도의 핵심 이었지만 길게는 – dynamo

+0

을 사용하려고했으나 문제가 해결되면 내 대답을 수락 할 수 있습니까? – dynamo

1

컨트롤러 방법은 아무것도 반환하지 않습니다

@RequestMapping(value = "/{carId}", method = RequestMethod.GET) 
Car getCarById(@PathVariable(value = "carId") Long carId) { 
    carDb.get(carId) 
} 

이 방법 것조차 compil하지, 전자 당신이 자동차를 반환하지만 아무것도 반환하지 않습니다를 지정한다. 잘못된 코드를 게시했거나 사용중인 방법이 다르게 보일 수 있습니다. 당신이해야 할 일은, 거기에있는 Car의 인스턴스를 반환해야합니다.

+0

Isele-prefabware 이것은 Groovy입니다. return 문은 필요 없습니다. 위의 GitHub 레포에서 정확한 코드를 확인하는 것을 잊지 마십시오. 그게 컴파일하고 일어서 완전히 작동 봄 애플 리케이션 그게 전부 야. – smeeb

1

작동이 같은지도하고 원래 코드 initalize 다음

@RequestMapping(value = "/{carId}", method = RequestMethod.GET) 
Car getCarById(@PathVariable(value = "carId") Long carId) { 
    println 'car >> ' + carDb.get(carId) 
    return new Car(
     1, UUID.fromString("d3bdc4ea-4c62-4bd2-a751-681a531f34f4"), 
     new CarType(10, UUID.fromString("ba4dc4ea-4c62-4bd2-a751-681a531f3487"), "Sedan", "SEDAN"), 
     "Toyota", "Corolla") 
} 

을 시도합니다.당신은 <Long,Car>로 정의하지만, 초기 데이터를 추가 할 때 당신은 당신의 차를 위해 Integer 사용 : 키 1L (롱) 당신이 아무 것도 얻을지도의 일부인 경우

carDb.put(1, new Car(
     1L, UUID.fromString("d3bdc4ea-4c62-4bd2-a751-681a531f34f4"), 
     new CarType(10, UUID.fromString("ba4dc4ea-4c62-4bd2-a751-681a531f3487"), "Sedan", "SEDAN"), 
     "Toyota", "Corolla") 
    ) 

그래서 당신은지도를 요구하는 경우. 그러나 1 (정수로)은지도의 일부이며 자동차를 반환합니다. get 메서드는 Long 값을 가져 오지만 모든 키가 정수이므로 HashMap에서 자동차를 찾지 못합니다. 다음과 같이 긴 값으로지도를 초기화해야합니다.

static { 
    carDb = new HashMap<Long,Car>() 

    carDb.put(1L, new Car(
     1, UUID.fromString("d3bdc4ea-4c62-4bd2-a751-681a531f34f4"), 
     new CarType(10, UUID.fromString("ba4dc4ea-4c62-4bd2-a751-681a531f3487"), "Sedan", "SEDAN"), 
     "Toyota", "Corolla") 
    ) 
    carDb.put(2L, new Car(
     2, UUID.fromString("45a148b9-a44b-41c2-8ad4-c3b5069f091a"), 
     new CarType(11, UUID.fromString("b68148b9-a44b-41c2-8ad4-c3b5069f0922"), "Sport Utility Vehicle", "SUV"), 
     "Honda", "CRV") 
    ) 
    carDb.put(3L, new Car(
     3, UUID.fromString("fe9ede26-886a-4bd9-9b09-535387fffe88"), 
     new CarType(12, UUID.fromString("5a5ede26-886a-4bd9-9b09-535387fffe10"), "Truck", "TRUCK"), 
     "Chevy", "Silverado") 
    ) 
}