Java 传递参数后获取空值

Java 传递参数后获取空值,java,Java,我正在试图弄清楚为什么FinalTransactionSortableField.fromCode(orderBy)的值为null。我正在使用一个REST客户端 参数被传递到以下控制器方法中 我的控制器类中有以下方法: public ResponseEntity<SetRESTData<FinancialTransactionDTO>> getTFIUse( @RequestParam(value = "bId", required = true) final

我正在试图弄清楚为什么
FinalTransactionSortableField.fromCode(orderBy)
的值为null。我正在使用一个REST客户端 参数被传递到以下控制器方法中

我的控制器类中有以下方法:

public ResponseEntity<SetRESTData<FinancialTransactionDTO>> getTFIUse(

    @RequestParam(value = "bId", required = true) final String bId,
    @RequestParam(value = "status", required = false) final String statusString,
    @RequestParam(value = "transactionMethod", required = false) final String transactionMethodString,
    @RequestParam(value = "sortBy", required = false) final String orderBy,
    @RequestParam(value = "sortDirection", required = false) final String sortDirectionString) {

    //line 76 below 
    final FinancialTransactionPaginationData paginationData = StringUtils.isBlank(orderBy) ?
      null : new FinancialTransactionPaginationData(FinancialTransactionSortableField.fromCode(orderBy), null, null, sortDirectionString);
    //line# 79 below  
    final ServiceResultDetails<Set<FinancialTransactionDTO>> resultsDetails =
      financialTransactionService.getTransactionsForEmployeeUse(businessId,status, method, paginationData);

  }
当我将调试点放在第61行(return语句)时,我可以在eclipse中的调试器上看到值
createdTs
,如下所示:

public enum FinancialTransactionSortableField implements MappableEnum<FinancialTransactionSortableField>, SortableField {

  ID(DefaultSortableField.ID.getCode(), "Transaction Id", DefaultSortableField.ID.getColumnName()),
  CASH_AMOUNT("CashAmount", "Cash Amount", "cashAmount"),
  SECURITY_AMOUNT("SecurityAmount", "Security Amount", "securityAmount"),
  STATUS("Status", "Status", "status"),
  CREATED_TS(DefaultSortableField.CREATED_TS.getCode(),
             DefaultSortableField.CREATED_TS.getDescription(),
             DefaultSortableField.CREATED_TS.getColumnName()),;

  private final String code;
  private final String description;
  private final String columnName;

  private static final Map<String, FinancialTransactionSortableField> CODE_MAP =
    MappableEnumUtil.buildCodeMap(FinancialTransactionSortableField.class);

  private FinancialTransactionSortableField(final String code, final String description, final String columnName) {
    this.code = code;
    this.description = description;
    this.columnName = columnName;
  }

  @JsonValue
  @Override
  public String getCode() {
    return code;
  }

  @Override
  public String getDescription() {
    return description;
  }

  @Override
  public String getColumnName() {
    return columnName;
  }

  @Override
  public FinancialTransactionSortableField toEnum(final String code) {
    return fromCode(code);
  }

  @JsonCreator
  public static FinancialTransactionSortableField fromCode(final String code) {
    return CODE_MAP.get(code);
  }

}

供参考:

1)
code\u映射
是在类FinancialTransactionSortable字段中定义的映射,如下所示:

public enum FinancialTransactionSortableField implements MappableEnum<FinancialTransactionSortableField>, SortableField {

  ID(DefaultSortableField.ID.getCode(), "Transaction Id", DefaultSortableField.ID.getColumnName()),
  CASH_AMOUNT("CashAmount", "Cash Amount", "cashAmount"),
  SECURITY_AMOUNT("SecurityAmount", "Security Amount", "securityAmount"),
  STATUS("Status", "Status", "status"),
  CREATED_TS(DefaultSortableField.CREATED_TS.getCode(),
             DefaultSortableField.CREATED_TS.getDescription(),
             DefaultSortableField.CREATED_TS.getColumnName()),;

  private final String code;
  private final String description;
  private final String columnName;

  private static final Map<String, FinancialTransactionSortableField> CODE_MAP =
    MappableEnumUtil.buildCodeMap(FinancialTransactionSortableField.class);

  private FinancialTransactionSortableField(final String code, final String description, final String columnName) {
    this.code = code;
    this.description = description;
    this.columnName = columnName;
  }

  @JsonValue
  @Override
  public String getCode() {
    return code;
  }

  @Override
  public String getDescription() {
    return description;
  }

  @Override
  public String getColumnName() {
    return columnName;
  }

  @Override
  public FinancialTransactionSortableField toEnum(final String code) {
    return fromCode(code);
  }

  @JsonCreator
  public static FinancialTransactionSortableField fromCode(final String code) {
    return CODE_MAP.get(code);
  }

}
3) 下面是
buildLookupMap
实现

public static <E extends Enum<E> & MappableEnum<E>> Map<String, E> buildLookupMap(
    final Class<E> enumClass, final EnumValueGetter<E> getter) {
    final Set<E> values = EnumSet.allOf(enumClass);
    final E enumValue = values.iterator().next();
    addToExampleMap(enumClass, enumValue);

    final Map<String, E> lookupMap = new LinkedHashMap<>(values.size());


    for (final E value : values) {
      final Set<String> keys = getter.getKeys(value);
      for (final String key : keys) {
        if (lookupMap.containsKey(key)) {
          throw new FPIllegalArgumentException("Lookup map for {} has duplicate key {}", enumClass.getSimpleName(), key);
        } else {
          lookupMap.put(key, value);
        }
      }
    }

    return lookupMap;
  }
EXAMPLE\u MAP
是一个在类开始时声明的映射,如下所示:

private static final Map<Class<?>, MappableEnum<?>> EXAMPLE_MAP =
    new ConcurrentHashMap<Class<?>, MappableEnum<?>>(1000);
私有静态最终映射>示例映射=
新ConcurrentHashMap>(1000);

有人知道怎么了吗?如果需要更多信息,请告诉我。

好吧,如果
code\u MAP
中不存在
orderBy
的值,则MAP的get方法将返回null。@Evgeni但是,
行不应该返回code\u MAP.get(code)在这种情况下也将返回null,或者我在这里解释的是错误的吗?是的,它将是null。它有一个键,但有空value@janek您想让我粘贴
FinancialTransactionPaginationData
和'FinancialTransactionSortableField'的代码供您参考吗?您的问题可以完全归结为
buildCodeMap
的实现。如前所述,这不是Spring、Spring-4或Hibernate问题。请去掉那些标签。删除
LinkedHashMap
的源代码。删除
PaginationData
FinancialTransactionPaginationData
。仅在调用
fromCode
时保留非空参数值,即
enum
的实现。并添加
buildCodeMap
的实现。
 private static synchronized <E extends Enum<E> & MappableEnum<E>> void addToExampleMap(
    final Class<E> enumClass, final E enumValue) {
    if (!EXAMPLE_MAP.containsKey(enumClass)) {
      EXAMPLE_MAP.put(enumClass, enumValue);
    }
  } 

public static interface EnumValueGetter<E extends Enum<E> & MappableEnum<E>> {
    Set<String> getKeys(E e);
  }
private static final Map<Class<?>, MappableEnum<?>> EXAMPLE_MAP =
    new ConcurrentHashMap<Class<?>, MappableEnum<?>>(1000);