2013-11-27 16 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){} –

相關問題