2

我正在尝试访问此 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变量不为空。如何初始化?

提前致谢。

4

1 回答 1

1

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

确保执行此行后,您可以在 DB 的 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查询

于 2015-10-07T06:35:44.713 回答