2

HTMLフォームとJSONを提供/受信するためのSpringMVCコントローラーを作成しようとしています。最善の方法はRESTfulコントローラーを使用することのようですが、私が最初に書いたコントローラーとして、正しく実行したいと思います。

HTMLリクエストの場合はInternalResourceViewResolverによってレンダリングされるビューを返すか、ajaxリクエストの場合はJSONとしてレンダリングされるエンティティを返す1つのメソッドを持つことは可能ですか?

同じことが更新にも当てはまります。コンテンツタイプに応じて、着信JSONから変換されたオブジェクトまたはHTMLフォームからの@Validオブジェクトのいずれかを受け入れる単一のコントローラーメソッドを記述できますか?

私はあなたができる必要があるように思えます、そうでなければ、なぜsf taglibフォーム要素を使用してHTMLフォームでDELETEとPUTをサポートするのですか?どこでもそれを行う方法の説明を見つけることができないようです!

乾杯!NFV

4

2 に答える 2

2

これをやってみます。

これが私の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フォームまたはJSONオブジェクトをとして送信できます@RequestBody。試してみる。

于 2012-10-09T18:27:08.573 に答える
0

確かに可能ですが、なぜそれが役立つのかわかりません。

私の意見では、必要なすべてのアクションに対してコントローラーメソッドを作成する必要があります。コントローラーに2種類の入力を処理させると、このコントローラーメソッドの読み取りと保守が複雑になります。

これを行う方法は、このように@RequestMappingアノテーションでconsumesを使用することです。次に、2つのメソッドを記述し、それぞれがその種類の入力を監視します。

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

このコードのソース

于 2012-10-09T11:16:52.780 に答える