0

SpringMVCに基づくRESTサービスがあります。

これは私のコードです:

public class SitesController {

@RequestMapping(value="/rest/sites/{id}", method=RequestMethod.GET)
@ResponseBody
public SiteDTO getSite(@PathVariable String id) {
    Integer siteId = Integer.parseInt(id);

    Site site = cms.getSite(siteId);
    SiteDTO siteResult = new SiteDTO(site);
    return siteResult;
}

@RequestMapping(value="/rest/sites", method=RequestMethod.GET)
public SitesResult getSites(@RequestParam Integer companyId) {
    Collection<Site> sites = cms.getSites(cms.getCompany(companyId));
    SitesResult sitesResult = new SitesResult(sites);
    return sitesResult;
}

}

(問題に当てはまらないコードをスキップしました)

URLにアクセス/rest/sites/1すると、期待するデータが返されますが、アクセスすると/rest/sites?companyId=1404ページが表示されますHTTP Status 404 - /rest/rest/sites

ログには、関数内のコードgetSitesが実行されていることが示されていますが、その後、ログには次のように表示されます。org.springframework.web.servlet.view.JstlView Forwarding to resource [rest/sites] in InternalResourceView 'rest/sites'

実行されるのではなくリダイレ​​クトされるのはなぜですか?

アップデート

問題が見つかりました。上記の方法がなかったため@ResponseBody、コーディネーターがリクエストを転送しました。ここでの詳細情報、重要なことはIf the method is annotated with @ResponseBody, the return type is written to the response HTTP body. The return value will be converted to the declared method argument type using HttpMessageConverters.

4

2 に答える 2

1

メソッドの戻り値の型がサポートされている戻り値の型SitesResultの 1 つではないため、Spring は返されたオブジェクトをそのクラス名を使用して に追加し、リクエスト マッピングの値によって名前が付けられたビューをレンダリングしようとします。実際にはHTTP転送を行っているのではなく、ビューをレンダリングするために行うディスパッチャ転送を行っています(例: )。Model/rest/sitesservletsjsp

特定のビューを返したい場合は、その名前を含む文字列を返します。

その代わり

@RequestMapping(value="/rest/sites", method=RequestMethod.GET)
public SitesResult getSites(@RequestParam Integer companyId) {
    Collection<Site> sites = cms.getSites(cms.getCompany(companyId));
    SitesResult sitesResult = new SitesResult(sites);
    return sitesResult;
}

これを行う

@RequestMapping(value="/rest/sites", method=RequestMethod.GET)
public String getSites(@RequestParam Integer companyId, Model model) {
    Collection<Site> sites = cms.getSites(cms.getCompany(companyId));
    SitesResult sitesResult = new SitesResult(sites);
    model.addAttribute("sitesResult", sitesResult);
    String myView = "myView";
    return myView;
}
于 2013-02-20T15:20:53.933 に答える
0

これは私の側の単なる推測です...

getSitesメソッドは次のように宣言できます:

public SitesResult getSites(@RequestParam("companyId") Integer companyId) {

これが効果があるかどうかわかりませんか?

または、指定された論理ビュー名がビューにマップされていない可能性がありますか?

于 2013-02-20T15:03:18.327 に答える