SpringBootを使用してHelloWorldRestサービスを作成しました。スタンドアロンJavaプログラムを介してサービスを呼び出すことができます。また、Chrome用の Advanced Rest Client アドオンを介して呼び出すこともできます。
しかし、jQuery AJAX)を使用してスタンドアロンのHTMLページを介してヒットしようとすると、エラーが発生します
警告3748 --- [nio-9000-exec-2] o.s.web.servlet.PageNotFound:リクエストメソッド「GET」はサポートされていません
どんな助けでも大歓迎です。
PS:他のモードを使用してWebServiceを呼び出すことができるので、コントローラーは問題ないと思います。しかし、HTMLから呼び出す方法に問題があります。
以下のHTMLページ:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Client</title>
<script type="text/javascript" src="jquery-2.2.3.js">
</script>
<script type="text/javascript">
$(document).ready(function() {
$("#Submit").click(function() {
var input = {
"name": $("#name").val(),
"language": $("#language").val()
};
var inputStr = JSON.stringify(input);
alert(inputStr);
$.ajax({
url: "http://localhost:9000/rest/greetMeObj/",
method: "POST",
data: inputStr,
dataType: "jsonp",
success: function(output) { // callback method for further manipulations
var str = JSON.stringify(output);
$("#output").text(data);
},
error: function(data) { // if error occured
$("#error").text(data);
}
});
});
});
</script>
</head>
<body>
<div id="input">
<label><b>Name:</b>
</label>
<input type="text" name="name" id="name" alt="Enter you name" title="Enter your name" />
<br />
<br />
<label><b>Language:</b>
</label>
<select name="language" id="language" title="Select your language">
<option value="en" label="English" selected="selected">English</option>
<option value="fr" label="French">French</option>
<option value="nl" label="Dutch">Dutch</option>
</select>
<br />
<br />
<button title="Submit" type="button" name="Submit" id="Submit" value="Submit" formaction="POST">Submit</button>
</div>
<div id="output"></div>
<div id="error" style="color: red;"></div>
</body>
</html>
以下のSpringController
@Controller
@RequestMapping("/rest/*")
public class GreetingController {
private static final String TEMPLATE_EN = "Hello, %s!";
private static final String TEMPLATE_FR = "Bonjour, %s!";
private static final String TEMPLATE_NL = "Hallo, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping(value="/rest/greetMe", method= RequestMethod.GET)
public @ResponseBody Greeting sayHello(
@RequestParam(value = "name", required = false, defaultValue = "Stranger") String name,
@RequestParam(value = "language", required = false, defaultValue = "en") String language) {
return new Greeting(counter.incrementAndGet(), String.format(getTemplate(language), name));
}
@RequestMapping(value="/rest/greetMeObj", method= RequestMethod.POST)
public @ResponseBody Greeting sayHello(
@RequestBody(required = true) Input input) {
return new Greeting(counter.incrementAndGet(),
String.format(getTemplate(input.getLanguage()), input.getName()));
}
private String getTemplate(String language) {
String template;
switch (language) {
case "nl":
case "NL":
template = TEMPLATE_NL;
break;
case "fr":
case "FR":
template = TEMPLATE_FR;
break;
case "en":
case "EN":
default:
template = TEMPLATE_EN;
break;
}
return template;
}
}
解決策はここで説明されていると思います: SpringMVCリクエストメソッド 'GET'がサポートされていない理由
RequestMappingの両方の値は同じである必要があります。したがって、値ごとに、GET用とPOST用に1つずつ定義する必要があります。
@RequestMapping(value="/rest/greetMe", method= RequestMethod.GET)
public @ResponseBody Greeting sayHello(
@RequestParam(value = "name", required = false, defaultValue = "Stranger") String name,
@RequestParam(value = "language", required = false, defaultValue = "en") String language) {
return new Greeting(counter.incrementAndGet(), String.format(getTemplate(language), name));
}
@RequestMapping(value="/rest/greetMe", method= RequestMethod.POST)
public @ResponseBody Greeting sayHello(
@RequestBody(required = true) Input input) {
return new Greeting(counter.incrementAndGet(),
String.format(getTemplate(input.getLanguage()), input.getName()));
}
これらの呼び出しのいずれかをデフォルトのマッピングにマッピングした場合は、コントローラーを確認してください。
@DeleteMapping()
@PostMapping()
@GetMapping()
path="/"
にマップされます。に変更してください
@DeleteMapping(path="/something")
@PostMapping(path="/something")
@GetMapping(path="/something")