2012-10-09 3 views
2

Im은 HTML 폼과 JSON을 제공/받기 위해 스프링 MVC 컨트롤러를 작성하려고합니다. 가장 좋은 방법은 RESTful 컨트롤러를 사용하는 것으로 보이지만 첫 번째 필자로 작성된 필자는 올바르게 작성하려고합니다.스프링 MVC 3.1 RESTful 컨트롤러

HTML 요청 인 경우 InternalResourceViewResolver에서 렌더링 할 뷰를 반환하거나 아약스 요청 인 경우 JSON으로 렌더링 할 엔터티를 반환 할 수 있습니까?

업데이트도 마찬가지입니다. 콘텐트 유형에 따라 들어오는 JSON에서 변환 된 객체 또는 HTML 객체의 @Valid 객체를 받아들이는 단일 컨트롤러 메소드를 작성할 수 있습니까?

나는 당신이 할 수 있어야합니다, 그렇지 않으면 왜 HTML 태그에서 sf taglib 폼 요소를 사용하여 DELETE와 PUT을 지원해야합니까? 어디서나 어떻게 할 수 있는지에 대한 설명을 찾지 못하는 것 같습니다!

건배! NFV

답변

1

나는이 갈 줄 것이다. 여기

내가 내 Configuration 수업 시간에 무엇을 가지고 :

@Bean(name = "viewResolver") 
public ContentNegotiatingViewResolver viewResolver() { 
    final ContentNegotiatingViewResolver contentNegotiatingViewResolver = new ContentNegotiatingViewResolver(); 
    contentNegotiatingViewResolver.setOrder(1); 
    contentNegotiatingViewResolver.setFavorPathExtension(true); 
    contentNegotiatingViewResolver.setFavorParameter(true); 
    contentNegotiatingViewResolver.setIgnoreAcceptHeader(false); 
    final Map<String, String> mediaTypes = new HashMap<String, String>(); 
    mediaTypes.put("json", "application/x-json"); 
    mediaTypes.put("json", "text/json"); 
    mediaTypes.put("json", "text/x-json"); 
    mediaTypes.put("json", "application/json"); 
    mediaTypes.put("xml", "text/xml"); 
    mediaTypes.put("xml", "application/xml"); 
    contentNegotiatingViewResolver.setMediaTypes(mediaTypes); 
    final List<View> defaultViews = new ArrayList<View>(); 
    defaultViews.add(jsonView()); 
    defaultViews.add(xmlView()); 
    contentNegotiatingViewResolver.setDefaultViews(defaultViews); 
    return contentNegotiatingViewResolver; 
} 

@Bean(name = "xStreamMarshaller") 
public XStreamMarshaller xStreamMarshaller() { 
    return new XStreamMarshaller(); 
} 

@Bean(name = "xmlView") 
public MarshallingView xmlView() { 
    final MarshallingView marshallingView = new MarshallingView(xStreamMarshaller()); 
    marshallingView.setContentType("application/xml"); 
    return marshallingView; 
} 

@Bean(name = "jsonView") 
public MappingJacksonJsonView jsonView() { 
    return new MappingJacksonJsonView(); 
} 

을 그리고 여기에 Controller에가는 것입니다.

내 경험에서
@RequestMapping(value = { "/pets" }, method = RequestMethod.GET) 
public String list(Model model) { 
    model.addAttribute("pets", petRepository.findAll()); 
    return "pets/list"; 
} 

@RequestMapping(value = { "/pets" }, method = RequestMethod.POST) 
public String create(@Valid @RequestBody Pet pet, Model model) { 
    petRepository.save(pet); 
    return "redirect:pets/read/" + pet.getId(); 
} 

@RequestMapping(value = { "/pets/{petId}" }, method = RequestMethod.GET) 
public String read(@PathVariable Integer petId, Model model) { 
    model.addAttribute("pet", petRepository.findOne(petId)); 
    return "pets/read"; 
} 

@RequestMapping(value = { "/pets" }, method = RequestMethod.PUT) 
public String update(@Valid @RequestBody Pet pet, Model model) { 
    petRepository.save(pet); 
    return "redirect:pets/read/" + pet.getId(); 
} 

@RequestMapping(value = { "/pets/{orderId}" }, method = RequestMethod.DELETE) 
public void delete(@PathVariable Integer petId, Model model) { 
    petRepository.delete(petId); 
} 

, 당신은 HTML 양식 또는 @RequestBody 같은 JSON 객체를 제출할 수 있습니다. 시도 해봐.

+0

필자는 이와 같이 설정을 변경하려고 시도했지만 "HTTP 상태 415 - 요청 엔티티가 요청 된 메소드()에 대해 요청 된 리소스에서 지원되지 않는 형식이므로이 요청을 거부했습니다." @RequestBody 어노테이션을 제거하면 잘 작동합니다 (적어도 폼 포스트의 경우) – nfvindaloo

+0

'@ RequestBody'를 제거하고 HTML 양식과 JSON 제출물이 작동하는지 확인하십시오. 나는 봄이 당신을 위해 그것을 처리 할 것이라고 생각합니다. 어느 쪽이든, 단지'String' Spring을 반환 할 때 view (acceptType이 HTML 인 경우)로 이동하거나'Model' 객체를 JSON으로 변환합니다. – sbzoom

+0

고마워, 아프다! – nfvindaloo

0

분명히 가능하지만 그 이유는 유용하지 않습니다.

내 opnion에서는 필요한 모든 작업에 대해 컨트롤러 메서드를 만들어야하는데, 두 가지 종류의 입력을 처리하면이 컨트롤러 메서드가 시간이 지남에 따라 읽고 유지하기가 복잡해집니다.

이렇게하는 방법은 @RequestMapping annotation에서 이와 같이 소비하는 방법을 사용합니다. 그런 다음 2 가지 메소드를 작성하고 각 메소드가 입력되는 것을 감시합니다.

@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json"); 

source of this code

+0

필자는 프레임 워크가 구현을 단순하게 유지하고 DRYer를 유지하기 위해 모든 변환을 처리했을 것이라고 생각했습니다. 그렇다면 양식 요청에 DELETE 및 PUT 메소드를 사용하는 이유는 무엇입니까? 나는 HTML 폼에 대해 동일한 핸들러 메서드를 사용할 수 있다고 가정했지만 어쩌면 틀 렸습니다! – nfvindaloo

관련 문제