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);