RuntimeException: должна быть обеспечена реализация MemberAccess - PullRequest
0 голосов
/ 22 марта 2019

Я использую шаблон, который обращается к открытым полям объекта Customer, например:

<div>
    <div th:text="${customer.addressee}"></div>
    <div th:text="${customer.street}"></div>
    <div th:text="${customer.postalCode}, ${customer.city}"></div>
    <div th:text="${customer.country}"></div>
</div>

Однако, поскольку я звоню process() на TemplateEngine:

templateEngine.process(String.format("invoice/%s.html", locale), context);

Я получаю эту ошибку:

Caused by: java.lang.ClassNotFoundException: ognl.PropertyAccessor
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 40 more

Я подумал, что это может быть из-за того, что я что-то упустил из этой библиотеки ognl, поэтому я добавил зависимость:

    <dependency>
        <groupId>ognl</groupId>
        <artifactId>ognl</artifactId>
        <version>3.2.10</version>
    </dependency>

и пробовал разные версии, включая последнюю.Это, однако, дает мне:

org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "customer.addressee" (template: "invoice/de.html" - line 42, col 10)

    at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:191)
    at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:95)
    at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166)
    at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66)
    at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109)
    at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138)
    at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProces
    ...
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "customer.addressee"
    at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:191)
    at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:177)
    ... 48 more
Caused by: java.lang.RuntimeException: MemberAccess implementation must be provided!
    at ognl.OgnlContext.<init>(OgnlContext.java:140)
    at ognl.OgnlContext.<init>(OgnlContext.java:120)
    at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.executeExpression(OGNLVariableExpressionEvaluator.java:315)
    at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:170)
    ... 49 more

Я не могу найти ничего по этому вопросу.Я использую Spring Boot 2.1.1 и ognl 3.2.10:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <dependency>
        <groupId>ognl</groupId>
        <artifactId>ognl</artifactId>
        <version>3.2.10</version>
    </dependency>

</dependencies>

1 Ответ

0 голосов
/ 23 марта 2019

Как отметил @Ahmet в комментариях, мне не нужны никакие дополнительные зависимости OGNL. В любом случае, удивил бы меня. Проблема заключалась в том, что мой класс модели выглядел так:

public class Customer {
    public String addressee;
    public String street;
    public String postalCode;
    public String city;
    public String country;
}

Я не знал, что существуют явные общедоступные методы получения. Мне пришлось изменить модель на

public class Customer {
    private String addressee;
    private String street;
    private String postalCode;
    private String city;
    private String country;

    public String getAddressee() {
        return addressee;
    }

    public void setAddressee(String addressee) {
        this.addressee = addressee;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

Чтобы заставить это работать.

...