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

스프링의 @RequestMappingOptional에서 Guava library까지 어떻게 처리합니까? 매개 변수 값이 필요하지 않고 아무 것도 보내지 않으면 어떻게됩니까? Spring의 @RequestParam은 구아바의 선택 사항을 어떻게 처리합니까?

그것은됩니다

  • 설정
  • 설정 Optional.absent()null

Optional.fromNullable(T) 요청을 수락하는 데 사용할 수 있습니다 ?

+1

스프링은 적어도 기본적으로 구아바에 대해 알지 못하기 때문에 'null'이라고 생각합니다. –

+0

Spring에'name' 요청 매개 변수를'Optional'으로 변환하는 방법을 알려주기 위해'PropertyEditor'를 등록하는 것이 가능할 수도 있습니다. 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 (자바 8에서) 상자에서 처리하고 보장 Optional 있다는 자체가 null이 아니라, 원래의 질문은 매우 권장되지 @RequestParam로하는 사용 구아바의 com.google.common.base.Optional에 대해이었다 이 특정 경우 (이 null 일 수 있기 때문에).

(구아바의 Optional에 대해) ORIGINAL 답변 :

이, 그렇게 단지 String를 사용하고 봄이 방법으로 null을 처리하지 마십시오.

Optional<T>return value으로 사용되며 거의 매개 변수로 사용되지 않습니다. 완전히 불필요

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

(및 missuses Optional)가 달성 될 수 있기 때문에, : 당신이 null 체크 마무리합니다 property editor이 특별한 경우 봄 "name" 매개 변수 null에, 그래서 경우에도 사용자 정의를 구현 한 후 누락 된지도합니다 다음을 포함합니다 :

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

까지 Spring의 최신 버전이 jdk와 잘 작동 함 Optional type – 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

methodName로 (@RequestParam ("appRefNo") 문자열 appRefNo, \t \t \t \t \t \t \t \t @RequestParam (값 = "appStatus"= 거짓 필수) 문자열 appStatus) –

0

질문에 대한 대답은 선택적 매개 변수입니다. 먼저 null로 설정됩니다.

봄 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); 
     } 
     ... 
    } 
    ... 

을 발견했다. 그렇지 않으면 서블릿 요청에서 매개 변수 이름별로 매개 변수 값을 가져옵니다. 마지막으로 매개 변수 값이 null 인 경우 매개 변수가 필요한지 확인합니다. 필요에 따라서 예외를 throw합니다. 그렇지 않은 경우는 null을 리턴합니다.

4

Java 8 버전 java.util.Optional을 사용하는 것이 좋습니다. http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html의 오라클 설명서를보십시오. 또한 변수에 이름을 지정하십시오. 특히 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

의 별칭입니다. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ appStatus) {} –