我有一个带Maven的多模块Spring项目.我正在使用Spring 3.2.3和注释配置.
我有以下布局:
parent
common (depends on parent)
webapp (depends on parent, common, module1, module2)
module1 (depends on parent)
module2 (depends on parent)
Run Code Online (Sandbox Code Playgroud)
我需要它common,module1并且module2可以指定自己的i18n属性(并webapp收集这些文件并以某种方式提供它们?!):
common: src/main/resources/i18n/messages_en.properties
module1: src/main/resources/i18n/messages_en.properties
module2: src/main/resources/i18n/messages_en.properties
Run Code Online (Sandbox Code Playgroud)
我试过用
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/i18n/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
Run Code Online (Sandbox Code Playgroud)
但是看起来Spring只会使用其中一个翻译文件,而是应该使用all.
另一种可能性是为每个模块指定一个唯一的属性文件名,但后来我不知道要设置的基本名称messageSource.setBasename(...).
谢谢你的帮助!
spring spring-mvc internationalization multi-module spring-3
我有Rails PostGIS,activerecord-postgis-adapter并且rgeo-geojson正在运行.
目前我可以使用默认的"object.json"URL来获取WKT/WKB格式的JSON字符串.它看起来像这样:
{"description":null,"id":1,"position":"POINT (10.0 47.0)"}
Run Code Online (Sandbox Code Playgroud)
但是现在我想要一个自定义MIME类型,所以我可以调用"object.geojson"来获取GeoJSON格式,如下所示:
{"description":null,"id":1,"position":{"type":"Point","coordinates": [10.0, 47.0]}}
Run Code Online (Sandbox Code Playgroud)
我发现将JSON编码器设置为GeoJSON的唯一方法是使用RGeo::ActiveRecord::GeometryMixin.set_json_generator(:geojson)和全局设置它RGeo::ActiveRecord::GeometryMixin.set_json_generator(:wkt).但我只是想在本地设置它,这可能吗?
我已经加入Mime::Type.register "application/json", :geojson, %w( text/x-json application/jsonrequest )到mime_types.rb和它的作品罚款:我可以在我的控制器使用此代码:
respond_to do |format|
format.json { render json: @object }
format.geojson { render text: "test" }
end
Run Code Online (Sandbox Code Playgroud)
我希望有人可以告诉我如何在不设置全局JSON渲染器的情况下将一些特定对象渲染到GeoJSON :geojson.!?
编辑:
我的对象在Rails控制台中看起来像这样:
#<Anchor id: 1, description: nil, position: #<RGeo::Geos::CAPIPointImpl:0x3fc93970aac0 "POINT (10.0 47.0)">>
我刚刚开始了一个新的春季项目,这次我想做"正确"的事情.在上一个项目中,由于多个@ComponentScan注释,我遇到了多个注册某些类的问题.(即所有服务类都注册了两次)
基本上我使用以下布局:
WebAppInitializer:
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebMvcConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
Run Code Online (Sandbox Code Playgroud)
RootConfig:
@Configuration
@ComponentScan
public class RootConfig {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
WebMvcConfig:
@EnableWebMvc
@ComponentScan
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
DatabaseConfig:
@Configuration
@EnableJpaRepositories("my.base.class.path")
public …Run Code Online (Sandbox Code Playgroud) 我尝试使用@RequestBody byte[] data自动 Base64 解码器,以便接收一些 RSA 加密数据,然后在我的服务中解密:
控制器:
@RequestMapping
void doIt(@RequestBody byte[] data) {
service.doIt(data);
}
Run Code Online (Sandbox Code Playgroud)
服务:
void doIt(byte[] encryptedData) {
String testDataString = "hgLGtzF4D8tlJbVivQgaXXwfI9TbQ//PrYHEez5k93sqJSi17eLCa+r/cGNGvoxDRaPYONvP4yxW0ajKDFrusQ4V4owfhkijS9KzBOTjBeAVmA+5jBsZCdoxwCA65DiP5lJ+GRbn8CjcjCr4DaEWFbWHsyvY4NGGAQLuYv+PyZipfU9pXTEDsBb15NwaHlD5m7Z4CHWdWTt1ARvRaQs56Bp63/IEmGR7w4brA1+iuKPv83FLh0rsxyoJ+F8TeqtuPhm2fHTh1FiHn0Bpaqqoyd/cBl0/utSzu4qoZhB3AiVgLjnT6Iy9p5nVoAozxQo/Es59LrpGZfjYJer073jNIg==";
byte[] testDataBytes = Base64.decodeBase64(testDataString);
System.out.println(encryptedData.length);
System.out.println(testDataBytes.length);
System.out.println(new String(encryptedData).length());
System.out.println(Base64.encodeBase64String(testDataBytes).length());
System.out.println(new String(encryptedData).equals(Base64.encodeBase64String(testDataBytes)));
}
Run Code Online (Sandbox Code Playgroud)
要求:
Content-Type: application/octet-stream
Request Payload:
hgLGtzF4D8tlJbVivQgaXXwfI9TbQ//PrYHEez5k93sqJSi17eLCa+r/cGNGvoxDRaPYONvP4yxW0ajKDFrusQ4V4owfhkijS9KzBOTjBeAVmA+5jBsZCdoxwCA65DiP5lJ+GRbn8CjcjCr4DaEWFbWHsyvY4NGGAQLuYv+PyZipfU9pXTEDsBb15NwaHlD5m7Z4CHWdWTt1ARvRaQs56Bp63/IEmGR7w4brA1+iuKPv83FLh0rsxyoJ+F8TeqtuPhm2fHTh1FiHn0Bpaqqoyd/cBl0/utSzu4qoZhB3AiVgLjnT6Iy9p5nVoAozxQo/Es59LrpGZfjYJer073jNIg==
Run Code Online (Sandbox Code Playgroud)
输出:
(Spring) Byte length: 344
(test) Byte length: 256
(Spring) Base64 String length: 344
(test) Base64 String length: 344
Base64 String equals: true
Run Code Online (Sandbox Code Playgroud)
如你看到的:
该请求包含与我放入源代码中的测试数据完全相同的数据。
进行 Base64 编码后,两者具有相同的长度并且“相等”
但是:字节数组的长度不同。
为什么byte[]Spring生成的比较大呢?(当尝试使用某些 RSA …
我试图ControllerLinkBuilder.methodOn()用非String类型调用Spring ,它总是失败.我不知道使用哪种Converter以及在何处注册.
这是我的控制器:
@RestController
@RequestMapping("/companies")
class CompanyController {
@RequestMapping(value="/{c}", method=RequestMethod.GET)
void getIt(@PathVariable Company c) {
System.out.println(c);
Link link = linkTo(methodOn(getClass()).getIt(c));
}
}
Run Code Online (Sandbox Code Playgroud)
该System.out.println(c)效果很好.我的Company域对象从数据库获取.(我正在使用DomainClassConverter)
但另一种方式不起作用: ConverterNotFoundException: No converter found capable of converting from type @PathVariable Company to type String
我只需要一个Converter<Company, String>吗?我应该在哪里注册?我在addFormatters(FormatterRegistry registry)方法中尝试了一些东西WebMvcConfigurationSupport,但它确实显示了同样的错误.但毕竟我不确定我到底尝试了什么......
我有以下课程:
class Money {
CurrencyUnit currencyUnit;
BigDecimal amount;
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我得到一些随机的Money对象列表:
currencyUnit | amount
---------------------
EUR | 5.1
EUR | 0
USD | 1.09
EUR | 42
USD | 3
Run Code Online (Sandbox Code Playgroud)
现在我想使用Java 8 Stream API创建以下结果(只需调用BigDecimal::add每个currencyUnit的金额):
currencyUnit | amount
---------------------
EUR | 47.1
USD | 4.09
Run Code Online (Sandbox Code Playgroud)
我已经知道/做了什么:
Stream<Money> moneyStream = moneyList.stream();
Run Code Online (Sandbox Code Playgroud)
它已经结束了.我知道我可以用a Collector来制作一个Map<CurrencyUnit, List<Money>>:
moneyStream.collect(Collectors.groupingBy(m -> m.getCurrencyUnit());
Run Code Online (Sandbox Code Playgroud)
但是,我仍然必须通过所有键值对并总结数量.
什么是正确的(也可能是最简单的方法)呢?它不可能那么复杂吧?:)
编辑:如果我不清楚我需要什么,这是我的旧Java代码:
Map<CurrencyUnit, Money> map = new HashMap<>();
moneyList.stream().forEach(e -> {
Money m = map.get(e.getCurrencyUnit());
if(m == …Run Code Online (Sandbox Code Playgroud) 我有一个任意的树结构.
root
|--node1
| |--node2
| | |--leaf1
| |
| |--leaf2
|
|--node3
|--leaf3
Run Code Online (Sandbox Code Playgroud)
每个节点和叶子有2个属性:id和name.
1.:给出了一个叶子id.查询应该返回从root到该leaf的整个路径,包含所有节点id和name属性.
如果返回值是排序的节点数组,或者它是嵌套节点的对象,那么这一点并不重要.
示例:如果给出了idof leaf2,则查询应返回:root(id, name), node1(id, name), leaf2(id, name).
2.:给定任何节点id:获取整个(子)树.在这里检索每个节点都有一个children数组的单个对象会很不错.
1.:首先,我尝试将树简单地建模为单个JSON文档,但随后查询将变得不可能:无法找出叶子的嵌套级别.如果我知道id从根到叶子的整个路径,我必须使用具有多个位置运算符的投影,而MongoDB目前不支持.此外,不可能对叶子进行索引,ids因为嵌套可以是无限的.
2.:下一个想法是使用平面数据设计,其中每个节点都有一个包含节点祖先的数组ids:
{
id: ...,
name: ...,
ancestors: [ rootId, node1Id, ... ]
}
Run Code Online (Sandbox Code Playgroud)
这样我就必须做2个查询,以获得从root到某个节点或叶子的整个路径,这非常好.
如果我选择数据模型2.:我如何获得整个树或子树?
获得所有后代很容易:find({ancestors:"myStartingNodeId"}).但那些当然不会被排序或嵌套.
有没有办法使用聚合框架或完全不同的数据模型来解决这个问题? …
我有一个Observable,可以从文本框中监听一些用户输入.如果观察到的字符串长度> = 3(filter),则执行一些HTTP调用(switchMap).
现在我想以某种方式检测用户输入是否已被过滤.原因:
如果已完成HTTP调用,则应显示结果.
如果用户输入已过滤(==无效),则应清除结果.
这是我想要的代码(参见:) ifFiltered:
this.userInput.valueChanges
.filter(val => val && val.length >= 3)
.ifFiltered(() => this.results = [])
.switchMap(val => getDataViaHTTP())
.subscribe(val => this.results = val);
Run Code Online (Sandbox Code Playgroud)
我知道,我可以将这个逻辑放在filter这个简单例子的函数中.但是,如果我有10个不同的过滤器呢?
我是否错过任何满足我需求的方法?
提前致谢!
我正在寻找一些好的建议/最佳实践来重用我的表单组件.
class Contact {
id?: String;
name: String;
}
Run Code Online (Sandbox Code Playgroud)
当创建一个新Contact的时,当然没有id,这就是为什么它在模型中是可选的.
当编辑一个Contact存在id,但它是不可编辑,因此它不是形式的一部分.
"编辑"和"创建"视图应使用相同的表单@Component,因为可用字段相同,验证约束也相同.
但两种观点必须有不同的行动.例如,"编辑"视图必须具有"删除并重新加载"按钮,当然两个视图的"保存"按钮的行为必须不同("创建"发出POST请求,"编辑发出PATCH请求").
我创建了一个ContactCreateComponent和一个ContactEditComponent,它们都<contactForm [contact]="contact"></contactForm>在他们的模板中.因为两个视图必须有不同的按钮和动作,所以我确实将Buttons放在Create和Edit Components中.
在ContactFormComponent有<form [formGroup]="form">和<input formControlName="name">标签.
现在我无法弄清楚如何从ContactFormComponent单击"保存"按钮时拉出表单数据.
我可以FormGroup在Create和Edit Components中定义,然后通过FormGroup实例将实例传递给Form Component @Input.这样我就可以读取/更新/重置表单数据.但后来我不得不FormGroup两次编写整个定义和验证器,但在我看来,这应该保留在Form Component中.
(我不想在@Input属性上使用双向绑定,因为它Contact是不可变的)
你知道如何解决这个问题吗?
我有以下示例对象:
let foo: Foo = {
'key1': { default: 'foo', fn: (val:string) => val },
'key2': { default: 42, fn: (val:number) => val },
// this should throw an error, because type of default and fn don't match
'key3': { default: true, fn: (val:string) => val }
}
Run Code Online (Sandbox Code Playgroud)
接口看起来应该是这样的:
interface Foo {
[key: string]: { default: T, fn: (val:T) => any }
}
Run Code Online (Sandbox Code Playgroud)
这当然不起作用,因为没有T定义.
所以我想这样做:
interface FooValue<T> {
default: T;
fn: (val:T) => any;
}
interface Foo { …Run Code Online (Sandbox Code Playgroud) generics type-inference typescript typescript-generics typescript2.0
spring ×4
spring-mvc ×4
angular ×2
multi-module ×2
ancestor ×1
arrays ×1
base64 ×1
controller ×1
converter ×1
converters ×1
descendant ×1
filter ×1
generics ×1
geojson ×1
java ×1
java-8 ×1
java-stream ×1
maven ×1
mongodb ×1
observable ×1
rxjs ×1
rxjs5 ×1
spring-3 ×1
tree ×1
typescript ×1
wkt ×1