我正在尝试访问此 url 以在搜索框中自动完成..
http://localhost:8080/api/v1/catalog/search/products?q=sauce
但是,我收到以下错误... 看来这里
@Resource(name = "blExploitProtectionService")
protected ExploitProtectionService exploitProtectionService;
exploitProtectionService 为空
这里是错误..
HTTP ERROR 500
Problem accessing /api/v1/catalog/search/products. Reason:
Server Error
Caused by:
java.lang.NullPointerException
at org.broadleafcommerce.core.web.api.endpoint.catalog.CatalogEndpoint.findProductsByQuery(CatalogEndpoint.java:190)
at com.mycompany.api.endpoint.catalog.CatalogEndpoint.findProductsByQuery(CatalogEndpoint.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
我的web.xml如下
<servlet>
<servlet-name>RESTApiServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.mycompany.api.endpoint</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>RESTApiServlet</servlet-name>
<url-pattern>/api/v1/*</url-pattern>
</servlet-mapping>
接下来,我的applicationContext.xml是
<context:component-scan base-package="org.broadleafcommerce.core.web.api"/>
和applicationContext-security.xml是
<!-- Set up Spring security for the RESTful API -->
<sec:http pattern="/api/**" create-session="stateless">
<sec:http-basic />
<sec:custom-filter ref="blRestCustomerStateFilter" after="REMEMBER_ME_FILTER"/>
</sec:http>
<!-- Used for REST api calls. This just takes in the passed in customerId and uses it to establish the customer. -->
<!-- Additional considerations MUST be made for implementations that are allowing external access to APIs. -->
<bean id="blRestCustomerStateFilter" class="org.broadleafcommerce.profile.web.core.security.RestApiCustomerStateFilter"/>
如何解决这个问题?如何使 exploitProtectionService
变量不为空。如何初始化?
提前致谢。
最佳答案
REST 中的搜索功能由 solr 完成。当您传递 q="something"时,它将通过 solr 查询进行搜索。
所以当你像 q=* 这样在 q 中传递 * 时,它就会起作用。但是,当您传递 q="sauce"时,它将不起作用,要使其起作用,您必须根据产品名称进行 solr 索引。
为此,将上面的 sql 行放在项目的 core/src/main/resources/sql/load_catalog_data.sql 中:
INSERT INTO BLC_FIELD (FIELD_ID, ENTITY_TYPE, PROPERTY_NAME, ABBREVIATION, SEARCHABLE, TRANSLATABLE, FACET_FIELD_TYPE) VALUES (1, 'PRODUCT', 'defaultSku.name', 'name', TRUE, TRUE, 's');
INSERT INTO BLC_FIELD_SEARCH_TYPES (FIELD_ID, SEARCHABLE_FIELD_TYPE) VALUES (1, 't');
确保在执行此行后,您会在数据库的 BLC_FIELD 和 BLC_FIELD_SEARCH_TYPES 表中获得条目。
设置好之后,还得修改solr的配置。为此,从 site/src/main/resources 打开 schema.xml。将默认配置更改为以上行,
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="0"
generateNumberParts="0"
catenateWords="0"
catenateNumbers="0"
catenateAll="0"
preserveOriginal="1"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="0"
generateNumberParts="0"
catenateWords="0"
catenateNumbers="0"
catenateAll="0"
preserveOriginal="1"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
执行此操作后,您将能够搜索产品名称,因此当您在 q=""中传递产品名称时,它将返回结果。您可以为制造商、描述等做同样的事情...
要了解 solr,此链接会有所帮助。 solr query in broadleaf
关于java - Rest API - Broadleaf Commerce 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22461560/