我正在尝试使用MSBuild的复制任务递归地将文件夹复制到多个目标文件夹.我看到以下问题给了我一个良好的开端,但我必须遗漏一些东西:
我的构建文件中的代码段如下:
<ItemGroup>
<DeployPath Include="\\server1\path" />
<DeployPath Include="\\server2\path" />
</Item Group>
<Target Name="Deploy">
<Message Text="%(DeployPath.Identity)" />
<Copy SourceFiles="@(ItemsToCopy)" DestinationFolder="%(DeployPath.Identity)\%(RecursiveDir)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
当我运行它时,正如我所料,"消息"任务会吐出2行:
\\server1\path
\\server2\path
Run Code Online (Sandbox Code Playgroud)
问题是,"复制"任务似乎只运行一次,并将文件复制到当前硬盘驱动器的根目录而不是指定的网络路径:
复制到C:\file1.txt而不是\\server1\path\file1.txt
我对MSBuild很新,所以我觉得我在这里缺少一些非常基本的东西.
任何帮助将不胜感激.
我对如何在WCF(以及其他Web服务框架)中实现SOAPAction感到困惑.
在测试客户端中,我有一个Client Message Inspector,它配置为同时获取SOAP消息和随请求一起发送的任何HTTP头.至少在客户端消息检查器中,该操作显示为SOAP标头中的元素:
<s:Header>
<Action ... >http://myurl.com/2009/11/MyService/MyMethod</Action>
Run Code Online (Sandbox Code Playgroud)
但是,如果我在Fiddler中查看请求,则该Action元素丢失,而现在HTTP标头中还有一个附加条目:
SOAPAction: "http://myurl.com/2009/11/MyService/MyMethod"
Run Code Online (Sandbox Code Playgroud)
谁能解释一下到底发生了什么?
谢谢!
在Java EE应用程序(在Websphere上运行)中是否有任何简单的方法可以在整个集群中的应用程序范围内共享对象?某些东西可能类似于Servlet Context参数,但它在整个集群中共享.
例如,在服务器"A"和"B"的集群中,如果在服务器A上设置了值(key = value),则该值应该立即(或几乎如此)对服务器B上的请求可用.
(注意:如果可能,请避免使用分布式缓存解决方案.这实际上不是缓存方案,因为存储的对象是相当动态的)
我正在使用一个名为" Config" 的实用程序类的应用程序库,该实用程序类由Spring Environment对象支持,并为所有应用程序配置值提供强类型的getter.
配置的属性源可能因环境(DEV/PROD)和使用情况(独立/测试/ webapp)而异,范围可以从默认值(system&env props)到自定义数据库和JNDI源.
我正在努力的是如何让使用这个库的应用程序轻松配置所使用的属性源Environment,这样这些属性可以在我们的Config类中使用,也可以通过PropertySourcesPlaceholderConfigurer.
我们仍在使用XML配置,所以理想情况下,这可以用XML配置.
<bean id="propertySources" class="...">
<property name="sources">
<list>
<ref local="jndiPropertySource"/>
<ref local="databasePropertySource"/>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
...然后以某种方式注入到Environment的属性源集合中.
我已经读过,由于应用程序上下文生命周期的时间安排,这样的事情可能无法实现,并且可能需要使用应用程序初始化程序类来完成.
有任何想法吗?
要全局处理可能在Controller外部发生的错误(例如HTTP 404),我的web.xml中的条目类似于以下内容:
<error-page>
<error-code>404</error-code>
<location>/errors/404</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
在我的ErrorController中,我有类似于以下的相应方法:
@Controller
@RequestMapping("/errors")
public class ErrorController {
@RequestMapping(value = "/404", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<ErrorResponse> error404() {
ErrorResponse errorBody = new ErrorResponse(404, "Resource Not Found!");
return new ResponseEntity<ErrorResponse>(errorBody, HttpStatus.NOT_FOUND);
}
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是ContentNegotiationManager我配置的和消息转换器在这种情况下没有被使用.我怀疑由于请求被重定向到错误页面,因此内容协商中使用的原始请求属性将丢失,并将其视为完全独立的请求.(即原始请求/mycontroller/badresource.json - >/errors/404(没有文件扩展名))
在这样的错误处理程序中是否有任何方法确定和/或使用原始请求中请求的相应内容类型进行响应?
我知道你可以通过将它连接到log4net或将它输出到控制台("show_sql"选项)来查看NHibernate生成的SQL,但有没有办法在运行时获取代码中生成的SQL?
我希望能够做的是获取ICriteria对象(或IQuery)并将生成的SQL转储到屏幕或自定义日志(而不是log4net).就像是...
var sql = criteria.GetGeneratedSql() // Wishful thinking
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
编辑:感谢DanP为Java 提供的"Hibernate Criteria to SQL Translation"课程,我第一次尝试将其移植到NHibernate.似乎适用于简单的情况,但绝对可以使用一些改进(即错误处理等)
using NHibernate.Engine;
using NHibernate.Hql.Ast.ANTLR;
using NHibernate.Impl;
using NHibernate.Loader;
using NHibernate.Loader.Criteria;
using NHibernate.Persister.Entity;
public class HibernateHqlAndCriteriaToSqlTranslator
{
public HibernateHqlAndCriteriaToSqlTranslator() { }
public ISessionFactory SessionFactory { get; set; }
public string ToSql(ICriteria criteria)
{
var c = (CriteriaImpl) criteria;
var s = (SessionImpl)c.Session;
var factory = (ISessionFactoryImplementor)s.SessionFactory;
String[] implementors = factory.GetImplementors(c.EntityOrClassName);
var loader = new CriteriaLoader(
(IOuterJoinLoadable)factory.GetEntityPersister(implementors[0]),
factory,
c,
implementors[0],
s.EnabledFilters); …Run Code Online (Sandbox Code Playgroud) 寻找有关在多层应用程序中管理错误代码和消息的建议/最佳实践.特别是:
更新:重要的是要提到我不能仅仅依赖于异常和自定义异常类型来进行错误报告,因为此应用程序的一些客户端将通过Web服务(SOAP和REST)
欢迎任何建议!
我有一个WCF服务,每个服务都有REST和SOAP端点.这与本文类似地实现:WCF服务的REST/SOAP端点,其配置类似于以下内容:
<services>
<service name="TestService">
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="rest" binding="webHttpBinding" contract="ITestService"/>
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
问题是REST端点在结果WSDL中显示为附加端口和绑定.
有没有办法阻止REST端点包含在WSDL中?
我正在为现成的Java Web应用程序编写自定义扩展.该应用程序使用log4j进行日志记录,我想专门为我的扩展添加一个新的记录器和appender.问题是应用程序管理log4j.properties文件,该文件是根据管理界面UI中的选择动态生成的.由于这是一个"现成的"应用程序,我无法修改源代码.因此,如果我将自己的记录器和附加程序添加到文件中,则在管理员更改UI中的日志记录首选项时,它会被覆盖.
有可能让log4j从2个文件中获取它的配置吗?例如,我想要以下内容:
applog.properties #(Dynamically generated from admin UI)
mylog.properties #(My static properties)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,log4j会以某种方式组合两个文件中的条目以进行完整配置.
这可能吗?或者还有其他解决方法吗?
我正在开发一个Web API应用程序,它通过API连接到后端系统.使用API的一个挑战是它需要维护一个远程会话,该会话在Web API的所有线程/请求之间共享.会话每隔几个小时到期,需要通过登录"刷新".
我当前实现的简化版本如下:
private static Object loginLock = new Object();
if(!Api.IsLoggedIn)
{
lock(loginLock)
{
if(!Api.IsLoggedIn)
{
Api.Login();
}
}
}
// Do stuff with the API
Run Code Online (Sandbox Code Playgroud)
在高并发负载下,当需要登录时,线程会在锁定时堆叠起来,并在成功登录时一次通过一个线程,这会导致性能瓶颈.
我正在寻找的是一种在需要登录时阻止所有线程的方法,但是在成功登录后让它们全部通过.
有没有更好的模式来解决这个问题?谷歌搜索似乎表明,ReaderWriterLockSlim或者Monitor Wait/Pulse/PulseAll可能是比标准锁更好的候选人.