2013-11-27 62 views
29
@RequestMapping(value = "/contact.html", method = RequestMethod.POST) 
public final ModelAndView contact(
     @RequestParam(value = "name", required = false) Optional<String> name) { 

如何Spring的@RequestMapping处理来自Guava libraryOptional如果不需要参数值,并没有送到?Spring中的@RequestParam如何处理Guava的可选项?

会不会是:

  • 设置为null
  • 设置为Optional.absent()

Optional.fromNullable(T)用于接受请求吗?

+1

我相信它会是'null',因为Spring不知道任何番石榴,至少在默认情况下。 –

+0

可能注册一个'PropertyEditor'来告诉Spring如何将'name'请求参数转换为'Optional'。 http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html#beans-beans-conversion –

+2

没有'Optional.of(null)〜这样的东西〜。 –

回答

47

EDIT(2015年10月):春4处理java.util.Optional(从Java 8)开箱和保证Optional本身不是空,但原来的问题是关于番石榴的com.google.common.base.Optional其用法@RequestParam强烈劝阻在这个特定情况下(因为它可以为空)。

原来的答案(约番石榴的Optional):

不要那样做,只是用String,让春天在它的方式处理null

Optional<T>应该被用作return value并且很少作为参数使用。在这种特殊情况下,Spring将映射"name"参数null,所以即使实现自定义后失踪property editor你会null检查完成:

@RequestMapping("foo") 
@ResponseBody 
public String foo(@RequestParam(required = false) final Optional name) { 
    return "name: " + (name == null ? "null" : name.get()); 
} 

这是完全没有必要的(和missuses Optional),因为它可以实现与:

@RequestMapping("foo") 
@ResponseBody 
public String foo(@RequestParam(required = false) final String name) { 
    return "name: " + (name == null ? "null" : name); 
} 
+0

据我所知最新版本的Spring可以使用jdk可选类型 – Yura

+0

@Yura Spring 4处理['java.util.Optional'](https://docs.oracle.com/javase/8/docs/api/ java/util/Optional.html),但我确定['com.google.common.base.Optional'](http://docs.guava-libraries.googlecode.com/git- history/release/javadoc/com/google/common/base/Optional.html)(OP使用)不受支持。 – Xaerxess

+0

方法名(@RequestParam( “appRefNo”)字符串appRefNo, \t \t \t \t \t \t \t \t @RequestParam(值= “其appStatus”,需要=假)字符串其appStatus) –

0

您的问题的答案将是可选参数首先设置为空。

在春天HandlerMethodInvoker我发现resolveRequestParam方法

Object paramValue = null; 
    ... 
    if (multipartRequest != null) { 
    ... 
    // Check if this is multipart request and set paramValue in this case. 
    } 
    // Otherwise 
    if (paramValue == null) { 
     String[] paramValues = webRequest.getParameterValues(paramName); 
     if (paramValues != null) { 
      paramValue = (paramValues.length == 1 ? paramValues[0] : paramValues); 
     } 
    } 
    if (paramValue == null) { 
     if (defaultValue != null) { 
      paramValue = resolveDefaultValue(defaultValue); 
     } 
     else if (required) { 
      raiseMissingParameterException(paramName, paramType); 
     } 
     ... 
    } 
    ... 

所以我们首先检查它是否是一个多请求。否则,我们通过servlet请求中的参数名称获取参数值。最后,如果参数值为null,则检查是否需要参数。如果需要,我们抛出异常,否则返回null。

4

我推荐使用Java 8版本:java.util.Optional。查看http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html中的Oracle文档。 也给变量一个名字,特别是如果你使用Spring 3或更高版本:

import java.util.Optional; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.ModelAndView; 

@Controller 
public class LoginController 
{ 

    private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class); 

    @RequestMapping(value = "/login", method = RequestMethod.GET) 
    public ModelAndView getLoginPage(@RequestParam(name = "error", required = false) Optional<String> errorMsg) 
    { 
     //error.ifPresent(LOGGER::debug); //Java 8 with Optional 
     return new ModelAndView("login", "error", errorMsg); 
    } 

} 

java.util.Optional是管理可选parametrers,像错误在春季非常有用的。

+0

是不具有值,而不是指定的参数名称名称? – jbird

+0

正如你可能在这里看到的https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html,值是名称的别名 – EliuX

+0

我正在使用like waveow \t search(@RequestParam(“appRefNo”)String appRefNo,@RequestParam(value =“appStatus”,required = false)String appStatus){} –

相关问题