You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JAX-RS中为日期参数设置@DefaultValue:当前日期与最大值

Can We Set Dynamic Defaults for LocalDate Query Params with @DefaultValue?

Absolutely, you can make this work! The key thing to note is that @DefaultValue only accepts static string values (it’s a compile-time annotation, so dynamic values like LocalDate.now() can’t be passed directly). But we have two reliable ways to achieve your desired defaults:


Approach 1: Special Marker Strings + ParamConverter

This method leverages your existing ParamConverter<LocalDate> to interpret special marker strings from @DefaultValue and convert them to the dynamic dates you need.

Step 1: Update Your Endpoint with Marker Defaults

Add @DefaultValue using unique marker strings for your defaults:

@GET
public Response myFunction(
    @QueryParam("start") @DefaultValue("CURRENT_DATE") final LocalDate start,
    @QueryParam("end") @DefaultValue("MAX_DATE") final LocalDate end
) {
    // Your business logic here
}

Step 2: Modify Your ParamConverter to Handle Markers

Update your converter to check for these markers and return the corresponding dates:

public class LocalDateParamConverter implements ParamConverter<LocalDate> {
    private static final String CURRENT_DATE_MARKER = "CURRENT_DATE";
    private static final String MAX_DATE_MARKER = "MAX_DATE";
    private final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;

    @Override
    public LocalDate fromString(String value) {
        if (CURRENT_DATE_MARKER.equals(value)) {
            // Use default timezone, or specify one like ZoneId.of("UTC")
            return LocalDate.now();
        }
        if (MAX_DATE_MARKER.equals(value)) {
            return LocalDate.MAX;
        }
        // Fall back to normal date parsing for user-provided values
        return LocalDate.parse(value, formatter);
    }

    @Override
    public String toString(LocalDate value) {
        // Optional: Handle reverse conversion if needed
        if (value.equals(LocalDate.now())) {
            return CURRENT_DATE_MARKER;
        }
        if (value.equals(LocalDate.MAX)) {
            return MAX_DATE_MARKER;
        }
        return formatter.format(value);
    }
}

Step 3: Register the Converter (if not already done)

Make sure your converter is registered with JAX-RS via a ParamConverterProvider:

@Provider
public class LocalDateParamConverterProvider implements ParamConverterProvider {
    @Override
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
        if (rawType.equals(LocalDate.class)) {
            return (ParamConverter<T>) new LocalDateParamConverter();
        }
        return null;
    }
}

Ensure this provider is in a package scanned by your JAX-RS application, or explicitly register it in your Application subclass.


Approach 2: Direct Null Check in the Method

If your default logic is specific to this single endpoint, a simpler approach is to skip @DefaultValue entirely and check for null parameters directly:

@GET
public Response myFunction(
    @QueryParam("start") final LocalDate start,
    @QueryParam("end") final LocalDate end
) {
    // Assign defaults if parameters are not provided
    LocalDate actualStart = (start != null) ? start : LocalDate.now();
    LocalDate actualEnd = (end != null) ? end : LocalDate.MAX;
    
    // Your business logic using actualStart and actualEnd
}

Which Approach to Choose?

  • Use the marker + converter method if you need to reuse this default date logic across multiple endpoints (avoids repeating null checks everywhere).
  • Use the direct null check for a more lightweight, endpoint-specific solution.

内容的提问来源于stack exchange,提问作者user4597030

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:17:19