小编Ben*_*n M的帖子

Spring多模块i18n,带有扩展messageSource内容的模块

我有一个带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

7
推荐指数
1
解决办法
2598
查看次数

使用MIME类型呈现为GeoJSON(或选择性地呈现为WKT/WKB)

我有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)">>

ruby-on-rails geojson wkt

6
推荐指数
1
解决办法
3136
查看次数

在多模块Java-Config Spring MVC应用程序中使用@ComponentScan的正确方法

我刚刚开始了一个新的春季项目,这次我想做"正确"的事情.在上一个项目中,由于多个@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)

spring spring-mvc maven multi-module spring-java-config

6
推荐指数
1
解决办法
7506
查看次数

Spring的@RequestBody byte[]有什么问题(长度比预期大)?

我尝试使用@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 …

arrays base64 spring spring-mvc converters

6
推荐指数
1
解决办法
1万
查看次数

从@PathVariable DomainObject转换为String?(使用ControllerLinkBuilder.methodOn)

我试图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,但它确实显示了同样的错误.但毕竟我不确定我到底尝试了什么......

spring controller converter spring-mvc spring-hateoas

6
推荐指数
2
解决办法
2572
查看次数

使用Java 8 Stream API将List <X>聚合到List <X>

我有以下课程:

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)

java java-8 java-stream

6
推荐指数
1
解决办法
3967
查看次数

MongoDB树模型:获取所有祖先,获取所有后代

我有一个任意的树结构.

示例数据结构:

root
  |--node1
  |     |--node2
  |     |     |--leaf1
  |     |
  |     |--leaf2
  |
  |--node3
        |--leaf3
Run Code Online (Sandbox Code Playgroud)

每个节点和叶子有2个属性:idname.


重要的问题:

1.:给出了一个叶子id.查询应该返回从root到该leaf的整个路径,包含所有节点idname属性.

如果返回值是排序的节点数组,或者它是嵌套节点的对象,那么这一点并不重要.

示例:如果给出了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"}).但那些当然不会被排序或嵌套.

有没有办法使用聚合框架或完全不同的数据模型来解决这个问题? …

tree ancestor descendant mongodb aggregation-framework

6
推荐指数
1
解决办法
3480
查看次数

RxJs Observable:如果为空/过滤则执行函数

我有一个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个不同的过滤器呢?

我是否错过任何满足我需求的方法?

提前致谢!

filter observable rxjs rxjs5 angular

6
推荐指数
1
解决办法
1万
查看次数

Angular 2 - 用于创建和编辑的单个表单组件

我正在寻找一些好的建议/最佳实践来重用我的表单组件.

数据模型:

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是不可变的)

你知道如何解决这个问题吗?

angular2-forms angular2-template angular

6
推荐指数
1
解决办法
4625
查看次数

打字稿中键入的通用键值接口

我有以下示例对象:

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

6
推荐指数
1
解决办法
5292
查看次数