首页 > 解决方案 > 模板解析时出错

问题描述

代码 顺序

public class Order {
    private String id;
    private BigDecimal amount;
//get set constructor constructors
}

索引控制器

@Controller
public class IndexController {
    @GetMapping
    public String index() {
        return "index";
    }
}

订单控制器

@Controller
@RequestMapping("/orders")
public class OrderController {
    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @GetMapping
    public Mono<String> list(Model model) {
        var orders = orderService.orders();
        model.addAttribute("orders", orders);
        return Mono.just("orders/list");
    }
}

订单生成器

public class OrderGenerator {
    public Order generate() {
        var amount = ThreadLocalRandom.current().nextDouble(1000.00);
        return new Order(UUID.randomUUID().toString(), BigDecimal.valueOf(amount));
    }
}

订单服务

@Service
public class OrderService {

    private final Map<String, Order> orders = new ConcurrentHashMap<>(10);

    @PostConstruct
    public void init() {
        var generator = new OrderGenerator();
        for (int i = 0; i < 25; i++) {
            var order = generator.generate();
            orders.put(order.getId(), order);
        }
    }

    public Mono<Order> findById(String id) {
        return Mono.justOrEmpty(orders.get(id));
    }

    public Mono<Order> save(Mono<Order> order) {
        return order.map(this::save);
    }

    private Order save(Order order) {
        orders.put(order.getId(), order);
        return order;
    }

    public Flux<Order> orders() {
        return Flux.fromIterable(orders.values()).delayElements(Duration.ofMillis(128));
    }
}

html

<body>
    <h1>Orders</h1>
    <table>
        <thead>
            <tr>
                <th></th>
                <th>Id</th>
                <th>Amount</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="order : ${orders}">
                <td th:text="${order.id}"></td>
                <td th:text="${#numbers.formatCurrency(order.amount)}"
                    style="text-align: right"></td>
            </tr>
        </tbody>
    </table>
</body>

错误

模板解析时出错(模板:“类路径资源 [templates/orders/list.html]”)

评估 SpringEL 表达式的异常:“order.id”(模板:“orders/list” - 第 19 行,第 9 列)

EL1008E: 在“reactor.core.publisher.FluxOnAssembly”类型的对象上找不到属性或字段“id” - 可能不是公共的或无效的?

我不知道如何解决这个问题,我希望你能帮助我。谢谢你的回复。

标签: spring-bootthymeleaf

解决方案


您需要将 Flux 和 Mono 等反应原语添加为IReactiveDataDriverContextVariable.

IReactiveDataDriverContextVariable reactiveDataDrivenMode =
            new ReactiveDataDriverContextVariable(orders);

    model.addAttribute("orders", reactiveDataDrivenMode);

推荐阅读