Domanda

Ho un'applicazione Web Spring esistente, che utilizza due controller, che estendono AbstractController.Voglio integrare Spring Boot nell'applicazione, in modo che possiamo eseguirlo come applicazione standalone.

Sto affrontando un problema, perché Spring non sta inoltrando le chiamate al mio controller.Come posso mappare il controller a un modello di URL come " / app/*"?

Campionecontroller.Java

@Controller("myController")
public class SampleController extends AbstractController {
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.getWriter().print("Hello world!");
        return null;
    }
}

Applicazione.Java

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public SimpleUrlHandlerMapping sampleServletMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();

        Properties urlProperties = new Properties();
        urlProperties.put("/index", "myController");

        mapping.setMappings(urlProperties);

        return mapping;
    }
}

Quando avvio l'applicazione ricevo il seguente messaggio:

INFO  [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Mapped URL path [/index] onto handler 'myController'

Ma quando invio una richiesta a / index, ricevo i seguenti messaggi:

DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] Looking up handler method for path /index
DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] Did not find handler method for [/index]
DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Matching patterns for request [/index] are [/**]
DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] URI Template variables for request [/index] are {}
DEBUG [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] Mapping [/index] to HandlerExecutionChain with handler [org.springframework.web.servlet.resource.ResourceHttpRequestHandler@11195d3e] and 1 interceptor
È stato utile?

Soluzione

SimpleUrlHandlerMappings sono ordinati e, come descritto nel javadoc il valore predefinito è Integer.MAX_VALUE il che significa che hanno la precedenza più bassa possibile.Questo provoca ResourceHttpRequestHandler (che è mappato a /** e ha un ordine di Integer.MAX_VALUE - 1 per impostazione predefinita) per avere la precedenza sulla mappatura per il controller.

Aggiorna il tuo sampleServletMapping() metodo per impostare l'ordine della mappatura su un valore inferiore a Integer.MAX_VALUE - 1.Biru:

@Bean
public SimpleUrlHandlerMapping sampleServletMapping() {
    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
    mapping.setOrder(Integer.MAX_VALUE - 2);

    Properties urlProperties = new Properties();
    urlProperties.put("/index", "myController");

    mapping.setMappings(urlProperties);


    return mapping;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top