Xử lý giá trị null trong Freemarker


Câu trả lời:


98

Bạn có thể sử dụng ??toán tử kiểm tra:

Điều này kiểm tra xem thuộc tính của đối tượng không phải là null:

<#if object.attribute??></#if>

Điều này kiểm tra nếu đối tượng hoặc thuộc tính không phải là null:

<#if (object.attribute)??></#if>

Nguồn: FreeMarker Manual


1
Sự khác biệt giữa cách tiếp cận này và has_content là gì ??
Anand B

3
has_content, bên cạnh kiểm tra null, cũng kiểm tra nếu giá trị không trống. Điều này hoạt động cho các chuỗi, chuỗi, băm hoặc tập hợp. Nếu đối tượng là một ngày tháng, boolean hoặc một số, thì đối tượng đó sẽ hoạt động như không rỗng. Đối với tất cả các loại khác, nó sẽ hoạt động như trống.
Tom Verelst 19/12/12

Tôi gặp sự cố này trong đó tôi phải kiểm tra xem giá trị trong bean có phải là null không. Tôi đã thử như sau: $ {checknull (Bean.getValue ())}, trong đó checknull nếu một hàm <# function checknull x> <#if x? ?> <#return ""> <#else> <#return x> </ # if> </ # function> nhưng tôi nhận được "Lỗi khi thực thi macro: tham số checknull bắt buộc: x không được chỉ định." error
Anand B

Bạn phải đảo ngược các kết quả trả về: <# function checknull x> <#if x ??> <#return x> <#else> <#return ""> </ # if> </ # function>
Tom Verelst

1
Vui lòng kiểm tra câu trả lời bên dưới: stackoverflow.com/a/27614219/3002336
Anand Varkey Philips,

106

Bắt đầu từ freemarker 2.3.7, bạn có thể sử dụng cú pháp này :

${(object.attribute)!}

hoặc, nếu bạn muốn hiển thị văn bản mặc định khi thuộc tính là null:

${(object.attribute)!"default text"}

1
Đối với những người đang sử dụng Freemarker làm công cụ mẫu cho XDocReport, điều này sẽ hoạt động sau khi thêm <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version></dependency>vào pom.xml của bạn.
Ludovic Guillaume

Làm thế nào để bạn làm điều đó nếu bạn có một ngày và ngày có thể bị trống? Nói cách khác object.dateAcquired nơi dateAcquired có thể là vô giá trị và bạn có $ {object.dateAcquired ngày?}
Stephane Grenier

1
Sử dụng @StephaneGrenier${(object.dateAcquired?date)!"not present"}
Tassos Bassoukos

1
Ví dụ tuyệt vời. Đã giúp tôi rất nhiều. Tuy nhiên, dấu ngoặc là obsolet. ${salutation!'Dear Mr. or Mrs.'}
Sim0rn

Bất kỳ ý tưởng làm thế nào tôi có thể in .now? Long trên giá trị mặc định?
Santiago Aceñolaza

4

Tôi nghĩ nó hoạt động theo cách khác

<#if object.attribute??>
   Do whatever you want....
</#if>

Nếu object.attributeKHÔNG ĐẦY ĐỦ, thì nội dung sẽ được in.


1

Sử dụng ??toán tử ở cuối <#if>câu lệnh của bạn .

Ví dụ này trình bày cách xử lý nullcác giá trị cho hai danh sách trong mẫu Freemaker.

List of cars:
<#if cars??>
    <#list cars as car>${car.owner};</#list>
</#if>
List of motocycles:
<#if motocycles??>
    <#list motocycles as motocycle>${motocycle.owner};</#list>
</#if>

-3

Nếu bạn có nhiều biến để chuyển đổi trong tùy chọn, bạn có thể sử dụng SubimeText với điều này:

Find: \${([A-Za-z_0-9]*)}
Replace: \$\{${1}!\}

Đảm bảo các tùy chọn regex và phân biệt chữ hoa chữ thường được bật:

Sublime regex thay thế

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.