[data-binding] Grails 날짜를 컨트롤러의 매개 변수로 바인딩하기



Answers

Grails 2.1.1에는 null 안전 구문 분석을위한 params에 새로운 메소드가 있습니다.

def val = params.date('myDate', 'dd-MM-yyyy')
// or a list for formats
def val = params.date('myDate', ['yyyy-MM-dd', 'yyyyMMdd', 'yyMMdd']) 
// or the format read from messages.properties via the key 'date.myDate.format'
def val = params.date('myDate')

here 에서 doc here 찾으 here

Question

grails 컨트롤러의 매개 변수를 통해 뷰에서 날짜를 추출하는 것이 왜 그렇게 어려운가요?

다음과 같이 손으로 날짜를 추출하고 싶지는 않습니다.

instance.dateX = parseDate(params["dateX_value"])//parseDate is from my helper class

난 그냥 instance.properties = params 를 사용하고 싶다.

모델에서 타입은 java.util.Date 이고 params는 모든 정보입니다 : [dateX_month: 'value', dateX_day: 'value', ...]

나는 그물을 수색하고 이것에 관해 아무것도 발견하지 못했다. Grails 1.3.0이 도움이 될 수 있기를 희망했지만 여전히 똑같은 일을했습니다.

나는 수작업으로 날짜를 추출하는 것이 필요하다는 것을 믿을 수 없다!




Grails 날짜 선택 도구 플러그인을 사용해 보셨습니까?

필자는 캘린더 플러그인에 대해 좋은 경험을했습니다.

(캘린더 플러그인을 사용할 때) 날짜 선택 요청을 제출할 때 쿼리 매개 변수를 요청으로 채울 도메인 개체에 자동으로 바인딩 할 수 있습니다.

예 :

new DomainObject(params)

다음과 같이 "yyyy / MM / dd"날짜 문자열을 구문 분석 할 수도 있습니다.

new Date().parse("yyyy/MM/dd", "2010/03/18")



Grails 버전> = 2.3

문자열을 날짜로 변환하는 localeAware 버전

src / groovy :

package test

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
import org.grails.databinding.converters.ValueConverter
import org.springframework.context.MessageSource
import org.springframework.web.servlet.LocaleResolver

import javax.servlet.http.HttpServletRequest
import java.text.SimpleDateFormat

class StringToDateConverter implements ValueConverter {
    MessageSource messageSource
    LocaleResolver localeResolver

    @Override
    boolean canConvert(Object value) {
        return value instanceof String
    }

    @Override
    Object convert(Object value) {
        String format = messageSource.getMessage('default.date.format', null, "dd/MM/yyyy", getLocale())
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format)
        return simpleDateFormat.parse(value)
    }

    @Override
    Class<?> getTargetType() {
        return Date.class
    }

    protected Locale getLocale() {
        def locale
        def request = GrailsWebRequest.lookup()?.currentRequest
        if(request instanceof HttpServletRequest) {
            locale = localeResolver?.resolveLocale(request)
        }
        if(locale == null) {
            locale = Locale.default
        }
        return locale
    }
}

conf / spring / resources.groovy :

beans = {
    defaultDateConverter(StringToDateConverter){
        messageSource = ref('messageSource')
        localeResolver = ref('localeResolver')
    }
}

bean의 이름 'defaultDateConverter'은 정말로 중요합니다 (기본 날짜 변환기를 대체하기 위해)




Related