ViewResolver с использованием аннотации Java
Возможно ли это в Spring 3.1.1 настроить конфигурацию представления с помощью аннотаций Java?
Я закончил со всеми конфигурациями с помощью аннотаций Java, но я застрял в view resolver.
Код
package com;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@ComponentScan("com")
public class AppConfig
{
{
//Other bean declarations
}
@Bean
public UrlBasedViewResolver urlBasedViewResolver()
{
UrlBasedViewResolver res = new InternalResourceViewResolver();
res.setViewClass(JstlView.class);
res.setPrefix("/WEB-INF/");
res.setSuffix(".jsp");
return res;
}
}
Я использовал этот код и запускал приложение, но не возвращал соответствующее представление. Однако, если я настроил viewresolver в файле app-servlet.xml
, он отлично работает.
Ответы
Ответ 1
Ваш класс должен расширить класс WebMvcConfigurerAdapter. пожалуйста, посмотрите ниже пример
@Configuration
@ComponentScan(basePackages="com")
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
Ответ 2
Я протестировал ваш сценарий с помощью Spring 4.3.4, и он работает нормально.
Я бы предложил двойную проверку пакетов, которые вы сканировали, и что AppConfig должным образом предоставлен.
Я прикрепляю все файлы, начиная с вашего AppConfig. Тем не менее, полезно расширить WebMvcConfigurerAdapter. Исходный код не идеален, он упрощен и только пытается воспроизвести проблему, о которой вы сообщили.
Начиная с AppConfig:
package com;
import org.springframework.context.annotation.*;
import org.springframework.web.servlet.view.*;
@Configuration
@ComponentScan("com")
public class AppConfig {
@Bean
public UrlBasedViewResolver getViewResovler() {
UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver();
urlBasedViewResolver.setViewClass(JstlView.class);
urlBasedViewResolver.setPrefix("/WEB-INF/jsp/");
urlBasedViewResolver.setSuffix(".jsp");
return urlBasedViewResolver;
}
}
Тогда:
package com;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { AppConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
Наконец:
package com;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MainController {
@RequestMapping("/")
public ModelAndView asdf() {
return new ModelAndView("ABC");
}
}
Ответ 3
Проблема с вышеизложенным заключается в том, что DispatcherServlet.initViewResolvers вызывается до определения bean getViewResolver и не может найти bean, чтобы он никогда не добавлял распознаватель вида.
Если вы переместите определение bean в определение xml, оно будет поднято. По какой-то причине класс MvcConfiguration, который вы определили, не вызывает обновление DispatcherServlet, если в XML не существует ViewResolvers.