2015-12-04 55 views
0

我讀過有關問題的每一個主題和我知道,使其餘的端點可以不設置@RequestParam一個需要設置在它required=false。我也知道在4.1版本中仍然存在一個錯誤,並且這個參數不會影響控制器的行爲,所以參數defaultValue應該完成這項工作。 而且仍然沒有工作對我來說:我想每個defaultValuerequired,並在同一時間他們兩個,我甚至想他們的不同的順序 - 我仍然得到Status 400 Bad Request如果我不把這些參數在get地址。 那麼解決方案是什麼?謝謝。 我的代碼如下:春4.1.6.RELEASE:@RequestParam默認值和所需=假不影響

public class Controller { 
@ResponseBody 
    @RequestMapping(value = "/api/", params = { "param"}, method = RequestMethod.GET, produces = { "application/json" }) 
    public Results show(HttpServletRequest request, HttpServletResponse response, 
      @RequestParam(value = "param", defaultValue = "all", required=false)) { 
     return null; 
    } 
} 

pom.xml中的部分:

 <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework-version}</version> 
      <exclusions> 
       <!-- Exclude Commons Logging in favor of SLF4j --> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>${org.springframework-version}</version> 
      <scope>test</scope> 
     </dependency> 

和web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <context-param> 
     <param-name>contextClass</param-name> 
     <param-value> 
     org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
    </param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 


    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.demshin.medpro.configuration.WebAppConfiguration</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>springServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>springServlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

和javaconfig:

@EnableWebMvc 
@Configuration 
@ComponentScan("com") 
@Import(MySQLconfiguration.class) 
public class WebAppConfiguration extends WebMvcConfigurerAdapter { 

    @Bean 
    public MappingJackson2HttpMessageConverter jacksonMessageConverter() { 
     MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); 

     ObjectMapper mapper = new ObjectMapper(); 
     // Registering Hibernate4Module to support lazy objects 
     mapper.registerModule(new Hibernate4Module()); 

     messageConverter.setObjectMapper(mapper); 
     return messageConverter; 

    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     // Here we add our custom-configured HttpMessageConverter 
     converters.add(jacksonMessageConverter()); 
     super.configureMessageConverters(converters); 
    } 

    @Bean 
    @Description("Thymeleaf template resolver serving HTML 5") 
    public ServletContextTemplateResolver templateResolver() { 
     ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); 
     templateResolver.setPrefix("/WEB-INF/html/"); 
     templateResolver.setSuffix(".html"); 
     templateResolver.setTemplateMode("HTML5"); 
     return templateResolver; 
    } 

    @Bean 
    @Description("Thymeleaf template engine with Spring integration") 
    public SpringTemplateEngine templateEngine() { 
     SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
     templateEngine.setTemplateResolver(templateResolver()); 
     return templateEngine; 
    } 

    @Bean 
    @Description("Thymeleaf view resolver") 
    public ThymeleafViewResolver viewResolver() { 
     ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); 
     viewResolver.setTemplateEngine(templateEngine()); 
     viewResolver.setContentType("text/html; charset=UTF-8"); 
     return viewResolver; 
    } 

    @Bean 
    @Description("Spring message resolver") 
    public ResourceBundleMessageSource messageSource() { 
     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
     messageSource.setBasename("/WEB-INF/i18n/messages"); 
     return messageSource; 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/"); 
    } 
} 

回答

2

問題你是否指定了params = { "param"}明確地在@RequestMapping級別,它將被繼承到它的較低級別。這意味着這應該在請求中。

對於有問題的例子:

@ResponseBody 
    @RequestMapping(value = "/api", params = { "param"},method = RequestMethod.GET, produces = { "application/json" }) 
    public String show(@RequestParam(value = "param", defaultValue = "all", required=false) String param, @RequestParam(value = "newparam", defaultValue = "all", required=false) String newparam) { 
     return param+newparam; 
    } 

這裏newparam我宣佈爲RequestParam,並給出optional.So請求:

http://localhost:8080/api?param=test 

會工作。但是,如果我們避免param從請求它會給400,因爲它宣佈已經在RequestMapping,所以應該在請求中存在。 您需要指定請求參數RequestMapping或@RequestParam。這意味着正確的方式來聲明上述方法是:

更正:

@ResponseBody 
    @RequestMapping(value = "/api", params = { "param"},method = RequestMethod.GET, produces = { "application/json" }) 
    public String show(String param, @RequestParam(value = "newparam", defaultValue = "all", required=false) String newparam) { 
     return param+newparam; 
    } 

簡單解決問題的方法是從@RequestMapping

所以刪除params = { "param"}我不認爲這是一個錯誤的彈簧

+0

這真棒解釋,我感謝!現在它按我需要的那樣工作。 –