У меня есть сервлет с @WebServlet("*.html")
и контроллер с @GetMapping("/greeting.html")
. Несмотря на то, что отображение контроллера является более конкретным, сервлет имеет приоритет.
В моем приложении я не могу тривиально изменить отображение сервлета (я нахожусь в процессе сложной миграции с сервлетов на Spring-Boot).
Я пробовал @Order
аннотацию и другие правила соответствия. Пока нет прогресса.
Вы можете воспроизвести его всего за 3 класса:
application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
GreetingController.java
package hello;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class GreetingController {
@GetMapping("/greeting.html")
@Order(Ordered.HIGHEST_PRECEDENCE)
@ResponseBody
public String greeting() {
return "this is geeting.html";
}
}
SimpleServlet.java
package hello;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
@WebServlet("/*.html")
@Order(Ordered.LOWEST_PRECEDENCE)
public class SimpleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("This is *.html servlet");
super.doGet(req, resp);
}
}
При доступе к localhost:8080
я ожидаю увидеть this is geeting.html
, вместо этого я получаю This is *.html servlet
.