Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 5

0
votes
answers
63 views
+10

應該將mvnw文件添加到存儲庫中嗎?

2

當創建彈簧啓動項目通過使用start.spring.io,一些行家封裝文件獲得包括:應該將mvnw文件添加到存儲庫中嗎?

  • mvnw
  • mvnw.bat

應該在提交給一個混帳回購協議時,有文件被忽略?

沙发
0
3

A mvnw Maven包裝腳本允許您在未安裝Maven的情況下運行Maven命令並將其顯示在PATH上。它通過在你的PATH上尋找Maven來實現,如果沒有找到它,它將它下載並安裝到默認位置(你的用戶主目錄,IIRC)。

它們很方便,但它們不一定是您項目的一部分,與您的項目代碼和配置不一樣。換句話說:

  • 任何給定的mnvw文件可用於多個不相關的項目
  • 一個mvn文件將幾乎肯定不會是不同項目的一個版本到另一個

在此基礎上,你可以作出一個案例不承諾mvnw到您的代碼庫。

然而,包括在你的回購一mvnw腳本確實有這些好處:

  • 允許任何人誰克隆/檢查出你的回購協議,以建立自己的項目,而不需要首先安裝Maven。
  • 確保正在使用的Maven版本是與您的項目兼容的版本。

在此基礎上,你都可以成爲的情況下犯mvnw你的代碼庫。

所以,雙方都有優點和缺點。只要選擇最適合那些將使用您的回購的人的需求的一面。或者:

  • 在您的自述文件中加入一些內容,明確指出(a)Maven是必備條件,(b)需要哪個版本的Maven。

...或:

  • 包括一個mvnw腳本。
板凳
0
1

這取決於,如果你想使用Maven包裝或不。如果不是,那麼你可以刪除這些文件。如果你想使用它,那麼你必須提交存儲庫中的文件,否則使用它是沒有意義的。

0
votes
answers
52 views
+10

如何在Spring Boot可執行文件中使用提供的jmagick庫?

0

我提供的位於/usr/share/java/jmagick-6.6.9.jar的jmagick庫。如何在Spring Boot可執行文件中使用提供的jmagick庫?

後啓動應用程序,我有錯誤:

java.lang.ClassNotFoundException: magick.MagickException

gradle.build已經jmagick:

provided group: 'jmagick', name: 'jmagick', version: '6.6.9' 

和application.properties有loader.path:

loader.path=jmagick-6.6.9.jar!/usr/share/java 
沙发
0
0

解決方案

集 'ZIP' 上的build.gradle佈局:

springBoot { 
    executable = true 
    layout = 'ZIP' 
} 

創建loader.properties:

loader.path=/usr/share/java/jmagick-6.6.9.jar 
0
votes
answers
46 views
+10

駱駝 - 如何移動碼頭集裝箱外的文件

0

我有一個容器內的彈簧啓動應用程序,我用駱駝來讀取一些文件,但我需要告訴駱駝開始讀取容器外,然後將相同的文件移動到一個這也是在容器外具體路徑,有人可以幫我?駱駝 - 如何移動碼頭集裝箱外的文件

這是我的代碼:

@Component 
public class Controlador extends RouteBuilder { 

    @Autowired 
    Procesador objProcesador; 

    @Override 
    public void configure() throws Exception { 
     from("ftp://[email protected]:port?password=password&passiveMode=true&delete=true").streamCaching().convertBodyTo(InputStream.class).process(objProcesador).to("/var/lib"); 
    } 

} 

在此先感謝

+0

使用[移動](http://camel.apache.org/file2.html)URI選項而不是刪除。 https://stackoverflow.com/questions/19905462/how-to-rename-and-move-the-file-on-ftp-once-processed-by-camel – Bedla

+0

是的,這將移動該文件,但我怎麼能指定一個在容器外面的路徑? –

+0

不確定你對「容器外」意味着什麼。如果這意味着在遠程FTP服務器上移動文件,那麼從camel-file2組件繼承的「move」選項應該可以工作 – Bedla

沙发
0
1

你怎麼在容器外的意思是?如果您的意思是運行容器的主機上的路徑,則需要將該路徑作爲卷共享。在使用"docker run.."時或在Dockerfile中設置音量。如果您的意思是駱駝應該通過ftp或sftp獲取文件,請確保容器可以先訪問該站點。

+0

是的,我需要一個來自主機的文件,但是有可能在兩個不同的路徑之間讀取和移動文件?因爲我需要從/ mnt /文件讀取文件,但後來將文件移動到主機上的另一個位置例如/ var/lib/files –

+0

是的。這兩個路徑必須被模仿爲[卷](https://docs.docker.com/engine/admin/volumes/volumes/#create-and-manage-volumes),以便容器可以訪問它。然後,您可以使用具有相對或絕對路徑的&移動選項來安裝音量。 – Bedla

+0

主機上需要的任何路徑都需要作爲卷裝入,以便容器到達它。 –

0
votes
answers
54 views
+10

Log4j2 JPAAppender BLOB

0

後2天log4j2戰鬥,Hibernate和Spring我終於JPAAppender工作..排序的..Log4j2 JPAAppender BLOB

我跟着這個例子:http://logging.apache.org/log4j/2.x/manual/appenders.html#JPAAppender

例子中的類創建一個表有這個結構:

CREATE TABLE `applicationLog` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `wrappedEvent` tinyblob, 
    PRIMARY KEY (`id`) 
) 

第一個問題是我不能記錄任何東西,因爲tinyblob太小了。我通過將tinyblob更改爲largeblob來手動解決此問題。

第一個問題:有沒有辦法讓類擴展BasicLogEventEntity來自己創建一個largeblob?

第二個問題:如何使用mysql客戶端讀取wrappedEvent?如何從日誌中獲取日誌的純文本?

感謝

沙发
0
0

所以我改變了實體如下,現在在db斑點總是空的(我並不需要它了),在其他列逐漸加入可讀的信息。這只是一個解決方法,但它是我能想到的最好的...

import java.time.Instant; 
import java.time.LocalDateTime; 
import java.time.ZoneId; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import lombok.Getter; 
import lombok.Setter; 
import org.apache.commons.lang3.exception.ExceptionUtils; 
import org.apache.logging.log4j.core.LogEvent; 
import org.apache.logging.log4j.core.appender.db.jpa.BasicLogEventEntity; 
import org.hibernate.annotations.Type; 

/** 
* 
* @author syco 
*/ 
@Entity(name = "applicationLog") 
@Table(name = "`applicationLog`") 
public class ApplicationLog extends BasicLogEventEntity { 

    @Getter 
    @Setter 
    @Column(name = "`customEventDate`") 
    private LocalDateTime customEventDate; 

    @Getter 
    @Setter 
    @Column(name = "`customException`") 
    @Type(type = "text") 
    private String customException; 

    @Getter 
    @Setter 
    @Column(name = "`customLevel`", length = 512) 
    private String customLevel; 

    @Getter 
    @Setter 
    @Column(name = "`customLogger`", length = 512) 
    private String customLogger; 

    @Getter 
    @Setter 
    @Column(name = "`customMessage`") 
    @Type(type = "text") 
    private String customMessage; 

    @Getter 
    @Setter 
    @Column(name = "`customThreadName`", length = 512) 
    private String customThreadName; 

    @Getter 
    @Setter 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "`id`") 
    private long id; 

    public ApplicationLog() { 
    super(); 
    } 

    public ApplicationLog(LogEvent logEvent) { 
    super(); 
    if (logEvent != null) { 
     setCustomEventDate(Instant.ofEpochMilli(logEvent.getTimeMillis()).atZone(ZoneId.systemDefault()).toLocalDateTime()); 
     if (logEvent.getThrown() != null) { 
     setCustomException(ExceptionUtils.getStackTrace(logEvent.getThrown())); 
     } 
     if (logEvent.getLevel() != null) { 
     setCustomLevel(logEvent.getLevel().name()); 
     } 
     setCustomLogger(logEvent.getLoggerName()); 
     if (logEvent.getMessage() != null) { 
     setCustomMessage(logEvent.getMessage().toString()); 
     } 
     setCustomThreadName(logEvent.getThreadName()); 
    } 
    } 
} 
0
votes
answers
59 views
+10

使用彈簧引導設置Ehcahe 3時出錯1.5

0

我最近從1.4升級到1.5.7的彈簧引導1.5.7,並發現Ehcache已從2.x升級到3.x。配置已全部改變。現在我無法設置緩存配置。使用彈簧引導設置Ehcahe 3時出錯1.5

我試過在Ehcache官方blog上的步驟,但沒有成功。

這裏是我的ehcache-dev.xml

<config 
     xmlns='http://www.ehcache.org/v3' 
     xmlns:jcache='http://www.ehcache.org/v3/jsr107'> 

    <service> 
     <jcache:defaults> 

      <jcache:cache name="categoryCache" template="catalog-cache"/> 
      <jcache:cache name="cfCategoryCache" template="catalog-cache"/> 

      <jcache:cache name="ebooks" template="other-cache"/> 
      <jcache:cache name="userNameToken" template="other-cache"/> 

     </jcache:defaults> 
    </service> 

    <cache-template name="catalog-cache"> 
     <heap unit="entries">200</heap> 
     <expiry> 
      <ttl unit="minutes">10</ttl> 
     </expiry> 
    </cache-template> 

    <cache-template name="other-cache"> 
     <!--<listeners>--> 
     <!--<listener>--> 
     <!--<class>org.terracotta.ehcache.EventLogger</class>--> 
     <!--<event-firing-mode>ASYNCHRONOUS</event-firing-mode>--> 
     <!--<event-ordering-mode>UNORDERED</event-ordering-mode>--> 
     <!--<events-to-fire-on>CREATED</events-to-fire-on>--> 
     <!--<events-to-fire-on>UPDATED</events-to-fire-on>--> 
     <!--<events-to-fire-on>EXPIRED</events-to-fire-on>--> 
     <!--<events-to-fire-on>REMOVED</events-to-fire-on>--> 
     <!--<events-to-fire-on>EVICTED</events-to-fire-on>--> 
     <!--</listener>--> 
     <!--</listeners>--> 
     <heap unit="entries">1000</heap> 
     <expiry> 
      <ttl unit="minutes">15</ttl> 
     </expiry> 
    </cache-template> 
</config> 

application-dev.properties文件包含行:

spring.cache.jcache.config=classpath:ehcache-dev.xml

dev曲線運行時,它會產生錯誤:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.cache.CacheManager]: Factory method 'jCacheCacheManager' threw exception; nested exception is javax.cache.CacheException: org.ehcache.xml.exceptions.XmlConfigurationException: Error parsing XML configuration at file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 135 more 
Caused by: javax.cache.CacheException: org.ehcache.xml.exceptions.XmlConfigurationException: Error parsing XML configuration at file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml 
    at org.ehcache.jsr107.EhcacheCachingProvider$ConfigSupplier.getConfiguration(EhcacheCachingProvider.java:327) 
    at org.ehcache.jsr107.EhcacheCachingProvider.getCacheManager(EhcacheCachingProvider.java:128) 
    at org.ehcache.jsr107.EhcacheCachingProvider.getCacheManager(EhcacheCachingProvider.java:79) 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration.createCacheManager(JCacheCacheConfiguration.java:115) 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration.jCacheCacheManager(JCacheCacheConfiguration.java:97) 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46f8ca07.CGLIB$jCacheCacheManager$1(<generated>) 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46f8ca07$$FastClassBySpringCGLIB$$fee1b5ae.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) 
    at org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration$$EnhancerBySpringCGLIB$$46f8ca07.jCacheCacheManager(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    ... 136 more 
Caused by: org.ehcache.xml.exceptions.XmlConfigurationException: Error parsing XML configuration at file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml 
    at org.ehcache.xml.XmlConfiguration.<init>(XmlConfiguration.java:167) 
    at org.ehcache.xml.XmlConfiguration.<init>(XmlConfiguration.java:131) 
    at org.ehcache.jsr107.EhcacheCachingProvider$ConfigSupplier.getConfiguration(EhcacheCachingProvider.java:324) 
    ... 150 more 
Caused by: org.xml.sax.SAXParseException; systemId: file:/**********/target/********/WEB-INF/classes/ehcache-dev.xml; lineNumber: 20; columnNumber: 17; cvc-complex-type.2.4.a: Invalid content was found starting with element 'expiry'. One of '{"http://www.ehcache.org/v3":heap-store-settings, "http://www.ehcache.org/v3":disk-store-settings, "http://www.ehcache.org/v3":service-configuration}' is expected. 
    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
    at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source) 
    at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source) 
    at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source) 
    at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source) 
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) 
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) 
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177) 
    at org.ehcache.xml.ConfigurationParser.<init>(ConfigurationParser.java:165) 
    at org.ehcache.xml.XmlConfiguration.parseConfiguration(XmlConfiguration.java:175) 
    at org.ehcache.xml.XmlConfiguration.<init>(XmlConfiguration.java:163) 
    ... 152 more 

現在,如果我沒有錯,它在cache-template元素內接受expiry元素有問題。但是,情況不應該如此,因爲它明確提到hereA <cache-template> element may contain all the same child elements as a <cache> element.cache元素確實具有expiry元素。

我無法理解我在這裏錯過了什麼。任何幫助讚賞。 TIA

沙发
0
1

顯然,問題是按照元素的順序。 heap元素需要在expiry元素之後。

下面的配置工作好嗎:

<cache-template name="catalog-cache">   
    <expiry> 
     <ttl unit="minutes">10</ttl> 
    </expiry> 
    <heap unit="entries">200</heap> 
</cache-template> 

這是沒有意義的,訂單不應該的問題。已與EhCache提交bug-report

0
votes
answers
41 views
+10

Spring Boot和Thymeleaf的查看幫助器

1

我是Spring Boot中的新成員,現在我們想用Spring Boot 2和Thymeleaf 3作爲模板引擎重寫Java中的舊PHP應用程序。Spring Boot和Thymeleaf的查看幫助器

我們的傳統應用程序擁有數百個包含數千個輸入字段的表單。爲此,我們使用一個簡單的模板助手,使得輸入字段,標籤和容器div非常簡單。一個小例子:

FormBuilder::addInputField("Close","close_time",$data->getClose_time()); 

生成:

<tr> 
    <th>Close:</th> 
    <td><input type="text" name="close_time" id="close_time_id" size="30" value=""> </td> 
</tr> 

我怎麼能在春天和Thymeleaf實現這一目標?

+0

是的,我們使用Thymeleaf V3。 – Vmxes

沙发
0
2

選項1.使用Thymeleaf片段

formBuilder.html

<!DOCTYPE html> 
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 

<tr th:fragment="inputField (title, name, value)"> 
    <th th:text="${title}"> or can use [[${title}]]</th> 
    <td><input type="text" th:name="${name}" 
       id="close_time_id" size="30" th:value="${value}"> </td> 
</tr> 
</body> 
</html> 

,然後在主佈局可以使用

<body> 
<table> 
    <tbody> 
    <tr th:replace="formBuilder::inputField ('Close','close_time', ${value})"></tr> 
    </tbody> 
</table> 
</body> 

選項2.使用春豆服務

Thymeleaf允許訪問在與@beanName語法(more info)的Spring應用上下文註冊的bean,例如:

<div th:text="${@formBuilder.addInputField('Close','close_time')}">...</div> 
+0

這兩個選項的作品,謝謝! 我還認識到另外一件事情,它看起來像是:替換隻能與碎片一起工作,而不能與bean服務一起工作。 bean服務可以像th這樣的形式使用它:replace?我的意思是消除輸出中的支架元件?所以在上面的例子中,我不希望持有者div標記bean服務的輸出。 – Vmxes

+0

@Vmxes使用'th:remove =「tag」'來消除持有者標籤 – varren

+0

或者我認爲,您可以使用http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expression-inlining' [[$ {@ formBuilder.addInputField('Close','close_time')}]]'沒有任何標籤 – varren

0
votes
answers
61 views
+10

Springboot無法訪問依賴jar的類路徑中的資源

0

我有一個spring引導JAR MyMain.jar,它具有BOOT-INF/lib內部的依賴jar。Springboot無法訪問依賴jar的類路徑中的資源

我想訪問BOOT-INF/lib/MyDep.jar/abcd.properties中的屬性文件。

我試過下面的代碼。

InputStream in = new ClassPathResource("abcd.properties").getInputStream(); 
System.out.println("InputStream : "+in); 
String line; 
BufferedReader br = new BufferedReader(new InputStreamReader(in));   
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 

這在我的Eclipse IDE中完美運行。但是當我在jar命令行上運行它時,它不會打印任何內容。

[email protected]65e

的readLine()給出的命令行運行期間空。

任何人都可以請幫忙!

+0

我發現有點難以遵循你正在嘗試做的事情,但它聽起來像應該起作用。也許你可以分享一個能夠再現問題的小樣本項目? –

+0

@AndyWilkinson - 基本上來自一個父jar文件類,我試圖讀取一個屬性文件內的依賴jar的類路徑。我將創建一個示例項目來共享 – RedGuts

沙发
0
0

或者,它適用於我。

在應用項目

@Configuration 
@ComponentScan("yourpackage") 
public class AppConfig { 
    @Configuration 
    @PropertySource("common.properties") 
    static class default{} 
} 

如果你想讀通過不同的配置文件(-Dspring.profiles.active)

@Configuration 
@ComponentScan("yourpackage") 
public class AppConfig { 
    @Profile("alpha") 
    @Configuration 
    @PropertySource("common-alpha.properties") 
    static class Alpha{} 

    @Profile("staging") 
    @Configuration 
    @PropertySource("common-staging.properties") 
    static class Staging{} 

    @Profile("production") 
    @Configuration 
    @PropertySource("common-production.properties") 
    static class Production{} 
} 

你可以使用Spring配置文件創建此類@Autowired註釋如下,但要確保你用@Component或類似的註解你的類。

@Autowired 
Environment env; 

在你的屬性文件

env.getProperty("property") 

我希望它可以幫助你可以得到的財產。

+0

我可以試一試,但我想將屬性源作爲參數參數,而不是硬編碼的靜態文件 – RedGuts

+0

@PropertySource(「$ {propertiesArgument} .properties」),並且您只傳遞-DpropertiesArgument在應用程序啓動期間提供的命令行參數。 –

0
votes
answers
51 views
+10

Spring編程bean自動裝配爲代理而不是目標

8

我創建了一個註釋,用於創建用環境中的值填充的ThreadPoolTask??Executors。但是,當我自動裝載這個bean時,它給了我一個代理並調用代理上的方法給出了錯誤的值。Spring編程bean自動裝配爲代理而不是目標

如果我手動訪問目標類,那麼我會得到正確的值。

Executor exec = (Executor) ((Advised) executor).getTargetSource().getTarget(); 
ThreadPoolTaskExecutor taskExec = (ThreadPoolTaskExecutor) exec; 

我一直在抓我的頭一陣子,爲什麼我得到一個代理bean,但似乎無法弄清楚。

我使用註釋導入實現ImportBeanDefinitionRegistrar的註冊器類來註冊bean。註冊商代碼如下:

public class ExecutorEnumerationRegistrar implements ImportBeanDefinitionRegistrar, EnvironmentAware { 

    public static final String CORE_POOL_SIZE = "corePoolSize"; 
    public static final String MAX_POOL_SIZE = "maxPoolSize"; 
    public static final String QUEUE_CAPACITY = "queueCapacity"; 
    public static final String THREAD_NAME_PREFIX = "threadNamePrefix"; 
    private static final String REJECTED_EXECUTION_HANDLER = "rejectedExecutionHandler"; 
    private static final String NAMES = "names"; 
    private static final String REJECTED_HANDLER = "rejectedHandler"; 
    private Environment env; 

    @Override 
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { 
     Map<String, Object> attrs = importingClassMetadata.getAnnotationAttributes(ThreadPoolTaskExecutorCreator.class.getName(), true); 
     final String[] beanNames = (String[]) attrs.get(NAMES); 
     final String[] policyClass = (String[]) attrs.get(REJECTED_HANDLER); 
     for (int x = 0; x < beanNames.length; x++) { 
      createAndRegisterBean(beanNames[x], policyClass[x], registry); 
     } 
    } 

    private void createAndRegisterBean(String name, String policyClass, BeanDefinitionRegistry registry) { 
     GenericBeanDefinition bd = new GenericBeanDefinition(); 
     bd.setBeanClass(ThreadPoolTaskExecutor.class); 
     bd.setAutowireCandidate(true); 
     bd.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); 
     MutablePropertyValues mpv = bd.getPropertyValues(); 
     populateProperties(mpv, name, policyClass); 
     registry.registerBeanDefinition(name, bd); 
    } 

    private void populateProperties(MutablePropertyValues mpv, String name, String policyClass) { 
     mpv.add(CORE_POOL_SIZE, Integer.valueOf(env.getProperty(name + "." + CORE_POOL_SIZE))); 
     mpv.add(MAX_POOL_SIZE, Integer.valueOf(env.getProperty(name + "." + MAX_POOL_SIZE))); 
     mpv.add(QUEUE_CAPACITY, Integer.valueOf(env.getProperty(name + "." + QUEUE_CAPACITY))); 
     try { 
      mpv.add(REJECTED_EXECUTION_HANDLER, Class.forName(policyClass).newInstance()); 
     } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     mpv.add(THREAD_NAME_PREFIX, name + "-"); 
    } 

    @Override 
    public void setEnvironment(Environment environment) { 
     env = environment; 
    } 

} 

註釋導入註冊地:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@Documented 
@Import(ExecutorEnumerationRegistrar.class) 
public @interface ThreadPoolTaskExecutorCreator{ 

    String[] names(); 

    String[] rejectedHandler() default ThreadPoolPolicyHandlers.CALLER_RUNS_POLICY; 

} 

我已經用下面的代碼進行測試: 春天引導類:

@EnableDiscoveryClient 
@ComponentScan("my.test.classes") 
@ThreadPoolTaskExecutorCreator(names = {"testExecutor"}, rejectedHandler = ThreadPoolPolicyHandlers.DISCARD_POLICY) 
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, 
    SessionAutoConfiguration.class, 
    DataSourceTransactionManagerAutoConfiguration.class, 
    JpaRepositoriesAutoConfiguration.class, 
    JndiDataSourceAutoConfiguration.class, 
    JndiConnectionFactoryAutoConfiguration.class, 
    RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class}) 
public class TestBoot { 

    public static void main(String[] args) { 
     SpringApplication.run(TestBoot.class, args); 
    } 
} 

從春天所有版本-boot-starter-parent 1.4.5.RELEASE

我寫了一個JUnit測試檢查值並通過。 唯一一次不起作用的是當我在Spring Boot eureka應用程序中自動裝入它時。有什麼我可以做的,它不會自動裝載代理bean?我查閱了文檔並查看了所有相關的類,但是我沒有看到與它爲什麼是代理相關的任何內容。另外,爲什麼當通過代理訪問時會產生不正確的值?

+1

你是什麼意思的「它給出了不正確的值」?你可以在代碼中分享注入和使用ThreadPoolTask??Executor的代碼嗎? – Babl

+0

我只是在另一個春天的豆子裏自動裝配它。我打印出核心池大小,最大池大小和隊列容量的值。它返回默認值而不是創建時發送的屬性。 –

+0

我在問,因爲你的代碼完全適合我:)可能你可以共享Spring/Spring Boot的版本嗎? – Babl

沙发
0
0

好像你缺少的代碼註冊實例您ImportBeanDefinitionRegistrar的(在你的例子是ExecutorEnumerationRegistrar) 因此,有兩種方式註冊ImportBeanDefinitionRegistrar直接使用@Import註釋或實現ImportSelector接口,它可以給你更多通用配置選項。

爲了您的情況,只需在Configuration類中添加@Import({ExecutorEnumerationRegistrar.class})即可。

@EnableDiscoveryClient 
@ComponentScan("my.test.classes") 
@ThreadPoolTaskExecutorCreator(names = {"testExecutor"}, rejectedHandler = ThreadPoolPolicyHandlers.DISCARD_POLICY) 
// THIS IS REQUIRED 
@Import({ExecutorEnumerationRegistrar.class}) 
// See Above 
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, 
SessionAutoConfiguration.class, 
DataSourceTransactionManagerAutoConfiguration.class, 
JpaRepositoriesAutoConfiguration.class, 
JndiDataSourceAutoConfiguration.class, 
JndiConnectionFactoryAutoConfiguration.class, 
RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class}) 
public class TestBoot { 

    public static void main(String[] args) { 
     SpringApplication.run(TestBoot.class, args); 
    } 
} 

,並只記得自動裝配的ThreadPoolTaskExecutor實例時使用的@Qualifier。看示例組件

@Component 
public class Component { 

    @Autowired 
    @Qualifier("testExecutor") 
    private ThreadPoolTaskExecutor exec; 

    // you methods 
} 
+0

我已經通過我的ThreadPoolTask??ExecutorCreator註釋導入了註冊商。我也爲此添加了代碼。我已經調試並測試了這段代碼很多次。它進入註冊商並創建bean。它也autowires它。問題是,它是自動裝配代理。 –

0
votes
answers
67 views
+10

ElasticSearch - 地理位置陣列上的空間搜索

0

我正在創建兩種類型的餐廳和分支與春季數據的索引。餐廳有許多分店作爲嵌套式。當我創建這個映射時,Spring Data/ElasticSearch自動將分支類型內的位置字段轉換爲緯度,經度數組,因此地理空間查詢是不可能的。這裏是:ElasticSearch - 地理位置陣列上的空間搜索

我想要在地理空間搜索的branch.location執行搜索,但彈性搜索不處理位置作爲地點,而是一個字符串數組,因此這是不可能的,請建議我需要什麼做什麼或哪裏出錯。

class Restaurant { 
    @Field(type = FieldType.Nested) 
    private List<Branch> branches = new ArrayList<Branch>(); 
} 

class Branch { 
    private GeoPoint location; 
} 
沙发
0
0

確保您使用的

org.springframework.data.elasticsearch.core.geo.GeoPoint

而且不

org.elasticsearch.common.geo。 GeoPoint

或者(也許更好),定義mappin g,而不是讓spring/elasticsearch爲你做。

0
votes
answers
59 views
+10

如何使用SpringSecurity和JDBI

0

我想用Spring配置服務器。我想同時使用Spring安全和JDBI。 所以我配置了我的服務器(?)的數據源並將其鏈接到JDBI。但是我無法在WebSecurityConfig中使用這個數據源。如何使用SpringSecurity和JDBI

這是我的主要配置的Java文件:

@SpringBootApplication 
    @EnableAutoConfiguration 
    public class Application extends WebMvcConfigurerAdapter { 

     private static DBI dbi = null; 

     public static void main(String[] args) { 
      SpringApplication.run(Application.class, args); 
     } 


     static DBI getDbi() { 
      if(dbi == null) { 
       DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "ndl", "ndl"); 
       dbi = new DBI(ds); 
      } 
      return dbi; 
     } 
    } 

這是出於安全春

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private DataSource dataSource; 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .antMatchers("/", "/home").permitAll() 
       .anyRequest().authenticated() 
       .and() 
       .formLogin() 
       .loginPage("/login.html") 
       .permitAll() 
       .and() 
       .logout() 
       .permitAll(); 
     http.csrf().disable(); 
    } 

    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth.jdbcAuthentication().dataSource(dataSource) 
       .usersByUsernameQuery(
         "select username,password from users where username=?") 
       .authoritiesByUsernameQuery(
         "select username, role from users where username=?"); 
    } 

} 

我得到這個錯誤的文件。

Field dataSource in rest.WebSecurityConfig required a bean of type 'javax.sql.DataSource' that could not be found. 

我試圖在類(而不是方法)中寫入DataSource ds。並添加註釋@Bean。但我得到了一個其他錯誤

public static DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "ndl", "ndl"); 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Bean 
    public static DataSource getDataSource(){ 
     return ds; 
    } 

和錯誤

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSecurityConfig': Injection of autowired dependencies failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/core/support/JdbcDaoSupport 

我希望你有什麼想法? 感謝;)

+0

什麼是JDBI .. –

+1

它的存在http://jdbi.org/getting_jdbi/? 這是一個工具,可以幫助你與數據庫 –

+1

我不需要這種工具。 但是我用Spring在其他項目中使用它,它很酷,所以我已經有很多可以輕鬆重用的代碼。 但我有春季安全問題。 –

沙发
0
0

發現問題。

我錯過以下依賴性:彈簧JDBC

所以我最後的build.gradle是

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.8.RELEASE") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'idea' 
apply plugin: 'org.springframework.boot' 

jar { 
    baseName = 'gs-rest-service' 
    version = '0.1.0' 
} 

repositories { 
    mavenCentral() 
    maven { 
     url 'https://repo.spring.io/libs-milestone' 
    } 
} 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web") 
    testCompile('org.springframework.boot:spring-boot-starter-test') 
    compile("org.springframework.boot:spring-boot-starter-security") 
    testCompile("org.springframework.security:spring-security-test") 
    compile group: 'org.jdbi', name: 'jdbi', version: '2.4.2' 
    compile group: 'com.h2database', name: 'h2', version: '1.3.148' 
    compile group: 'org.springframework', name: 'spring-jdbc', version: '4.3.8.RELEASE' 
}