小编Ben*_*n M的帖子

ManyToMany(带有附加列)使用@ElementCollection和java.util.Map?

我正在尝试优化我的@Entity课程.让我们来看一个User <-> Group关系的常见情况.我还想存储建立关系的日期.表格布局:

 USER      GROUP_USER      GROUP
------    ------------    -------
 id        user_id         id
 name      group_id        name
           createdAt
Run Code Online (Sandbox Code Playgroud)

有以下3个类:

  1. User@OneToMany List<GroupUser>
  2. GroupUser@ManyToOne User@ManyToOne Group
  3. Group@OneToMany List<GroupUser>

它有效,但它很常见的常见用例.例如:给我所有组User user:

List<Group> groups;
for(GroupUser gu : user.getGroupUsers) {
    groups.add(gu.getGroup());
}
Run Code Online (Sandbox Code Playgroud)

然后我想到了使用a的Map想法.所以我创建了以下3个类:

@Entity
class User {
   @Column(name="id")
   UUID id;

   @Column(name="name")
   String name;

   @ElementCollection
   @CollectionTable(name="Group_User")
   Map<Group, GroupUserRelationData> groups;
}

@Entity
class Group {
   @Column(name="id")
   UUID id;

   @Column(name="name")
   String name;

   @ElementCollection …
Run Code Online (Sandbox Code Playgroud)

many-to-many hibernate jpa map

13
推荐指数
1
解决办法
3529
查看次数

注入实现某些接口的所有服务

简单场景:

我有多个服务实现了一个通用接口.所有这些服务都在bootstrap方法中注册.

现在我想要另一个服务,它注入所有实现公共接口的注册服务.

export interface MyInterface {
    foo(): void;
}

export class Service1 implements MyInterface {
    foo() { console.out("bar"); }
}

export class Service2 implements MyInterface {
    foo() { console.out("baz"); }
}

export class CollectorService {
    constructor(services:MyInterface[]) {
        services.forEach(s => s.foo());
    }
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

angular2-services angular

12
推荐指数
2
解决办法
3467
查看次数

Angular 1.5组件绑定:检查回调是否存在

我有一个简单的contactList组件,它有2个绑定:contactsonRemove.

  • contacts 只是一组要显示的联系人
  • onRemove 是一个回调函数
app
  .component('contactList', {
    template: 
      `<div ng-repeat="c in $ctrl.contacts">
         {{c.name}}
         <div ng-click="$ctrl.onRemove({contact: c})">Remove</div>
       </div>`,
    bindings: {
      contacts: '<',
      onRemove: '&'
    },
    controller: function() {}
  })
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中多次使用此组件.而onRemove回调可以表现不同,这取决于其中contactList组件习惯.例:

  • contactMainView(=组件)显示搜索栏以及使用该contactList组件生成的联系人列表.onRemove将从数据库中删除联系人.

  • groupMembersView使用contactList组件显示属于给定组的所有联系人.这里不应该删除联系人,但onRemove不会设置.


思路:

首先我想,我可以使用ng-if="$ctrl.onRemove"但不起作用,因为onRemove它永远不会undefinedcontactList组件中.console.log(this.onRemove)总是打印:function(locals) { return parentGet(scope, locals); }

当然我可以使用另一种showRemove: '@'绑定,但这对我来说看起来并不干净.


你有任何想法或更好的解决方案来完成任务吗?

angularjs angularjs-directive angularjs-bindings angularjs-components

12
推荐指数
1
解决办法
2949
查看次数

RxJs flatMapLatest/switchMap取消回调.onCancel()在哪里?

我有2个嵌套的Observable Streams来做HTTP请求.现在我想显示一个加载指示器,但无法使其正常工作.

var pageStream = Rx.createObservableFunction(_self, 'nextPage')
        .startWith(1)
        .do(function(pageNumber) {
            pendingRequests++;
        })
        .concatMap(function(pageNumber) {
            return MyHTTPService.getPage(pageNumber);
        })
        .do(function(response) {
            pendingRequests--;
        });

Rx.createObservableFunction(_self, 'search')
        .flatMapLatest(function(e) {
            return pageStream;
        })
        .subscribe();



search();
nextPage(2);
nextPage(3);
search();
Run Code Online (Sandbox Code Playgroud)

这将触发pendingRequests++4次,但pendingRequests--只触发一次,因为flatMapLatest在前3个HTTP响应到达之前将取消内部observable.

我找不到像onCancel回调那样的东西.我也试过onCompletedonError,但这些不会太受被触发flatMapLatest.

有没有其他方法让这个工作?

谢谢!

编辑:所需的加载指示器行为

  1. 示例:单个search()呼叫.

    • search() - >开始加载指标
    • 当search()响应返回时 - >禁用加载指示符
  2. 示例:search()nextPage()致电.( search()响应返回之前调用nextPage().)

    • search() - >开始加载指标
    • nextPage() - >指标已经启动,但这里没什么可做的
    • 两个响应到达后停止加载指示器
  3. 示例: …

javascript reactive-programming observable rxjs

12
推荐指数
1
解决办法
3982
查看次数

Jackson,java.time,ISO 8601,序列化无毫秒

我正在使用Jackson 2.8并且需要与ISO 8601时间戳内不允许毫秒的API进行通信.

预期的格式是这样的: "2016-12-24T00:00:00Z"

我正在使用Jackson的JavaTimeModule WRITE_DATES_AS_TIMESTAMPS设置为false.

但这将打印毫秒.

所以我尝试使用objectMapper.setDateFormat哪个没有改变任何东西.

我目前的解决方法是:

ObjectMapper om = new ObjectMapper();

DateTimeFormatter dtf = new DateTimeFormatterBuilder()
    .appendInstant(0)
    .toFormatter();

JavaTimeModule jtm = new JavaTimeModule();
jtm.addSerializer(Instant.class, new JsonSerializer<Instant>() {
    @Override
    public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeString(dtf.format(value));
    }
});

om.registerModule(jtm);
Run Code Online (Sandbox Code Playgroud)

我正在覆盖默认的序列化工具Instant.class.


有没有什么好办法使用一些配置参数来解决这个问题?

java jackson jackson-modules java-time jackson2

12
推荐指数
3
解决办法
9306
查看次数

服务或控制器中的Spring DTO验证?

我正在使用Spring构建一个直接的AJAX/JSON Web服务.常见的数据流是:

  some DTO from browser

            v

Spring @Controller method

            v

  Spring @Service method
Run Code Online (Sandbox Code Playgroud)

我正在寻找处理数据验证的最简单方法.

  • 我知道@Valid注释在@Controller方法中很有效.
  • 为什么@Valid 不在@Service方法中工作?

我的意思是:服务方法可以被任何其他服务和控制器使用.那么在@Service级别验证会不会更有意义?


我们来看一个这个简单的例子:

MyDTO.java:

public class MyDTO {
   @NotNull
   public String required
   @Min(18)
   public int age;
}
Run Code Online (Sandbox Code Playgroud)

MyServiceImpl.java:

public MyDomainObject foo(MyDTO myDTO) {
  // persist myDTO
  // and return created domain object
}
Run Code Online (Sandbox Code Playgroud)

MyController.java:

@Autowired
MyService myService;

@Autowired     // some simple bean mapper like Dozer or Orika
Mapper mapper; // for converting domain objects …
Run Code Online (Sandbox Code Playgroud)

validation service spring spring-mvc dto

11
推荐指数
2
解决办法
2万
查看次数

Angular 2新路由器:更改/设置查询参数

我有一个注册的组件/contacts,它显示了一个联系人列表.我添加了一个<input [value]="searchString">用于过滤显示列表的内容.


现在我想以searchString查询参数的形式显示URL.(使用新路由器3.0.0 RC2)

官方文档(https://angular.io/docs/ts/latest/guide/router.html#!#query-parameters)显示了如何使用它router.navigate来更改queryParams.但这看起来很尴尬,因为我只是想改变它queryParams而不必知道我目前所处的路线:router.navigate(['/contacts'], {queryParams:{foo:42}})

(我知道如果我只是改变它,它不会重新加载组件queryParams,但是这仍然感觉不对)


经过一番尝试,我发现它router.navigate([], {queryParams:{foo:42}})有效.这感觉好多了.

但我仍然不确定这是不是正确的方法.或者,如果我错过了一些方法.


你怎么改变你的queryParams

angular2-routing angular

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

Spring的ResponseBodyAdvice:执行顺序?

我想实现一个自定义ResponseBodyAdvice,它只是查找Page<?>,然后将总元素的数量添加到响应头.

@ControllerAdvice
public class PageResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return Page.class.isAssignableFrom(returnType.getParameterType());
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        ((Page<?>) body).getTotalElements();
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 为什么body(在beforeBodyWrite方法内)类型MappingJacksonValue

  • 有没有更好的方法来实现这一目标?/我使用了错误的拦截器吗?

我不想处理包装类,但我只想PagebeforeBodyWrite方法中使用普通的未修改对象.


编辑:

我现在只是extend AbstractMappingJacksonResponseBodyAdvice.这很好用,但感觉不对.也许有人还有更好的主意.

这是以下代码Page -> Content-Range Header:

@ControllerAdvice
public class PageResponseAdvice extends …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc httpresponse spring-4

9
推荐指数
1
解决办法
2600
查看次数

JWT和每个用户一个(!)会话/无并发会话

我们当前的应用程序使用HTTP会话,我们希望将其替换为JWT。

该设置仅允许每个用户一次会话。这意味着:

  1. 用户在设备1上登录
    • 用户已在设备1上登录(创建了新会话)
  2. 用户在设备2上登录
    • 用户已在设备2上登录(创建了新会话)
    • 用户在设备1上登录(会话已被破坏)

之所以有效,是因为会话ID和用户ID之间存在服务器端关系。


我可以想象使用JWT在用户数据库中有一些计数器,每次登录时计数器都会增加,即:

  1. 用户在设备1上登录
    • JWT令牌签名包含计数器+1(并将新计数器保存到数据库)
  2. 用户在设备2上登录
    • JWT的签名包含counter + 1,它会增加并保存到db。

现在,对于每个请求,我都必须检查传入的签名对于当前计数器值是否正确。

这使它有状态:(

但是…… JWT的好处之一是,无需访问任何数据库或会话存储来验证令牌。


还有其他一些防止并发登录的解决方案吗?也许某些无需数据库访问就可以正常工作并使它保持无状态的东西吗?

session single-sign-on jwt single-page-application

9
推荐指数
1
解决办法
3685
查看次数

Angular2:Global Guard(用户必须始终登录)

我正在构建一个应用程序,对于未经身份验证的用户,根本无法访问.

我写了一个LoggedInGuard,但现在我必须添加canActivate: [LoggedInGuard]到我的路由器配置中的每个路由(除了LoginComponent).

有没有更好的方法让这个工作?


我的文件/模块布局如下所示:

app/
  AppModule
  AppRoutingModule
  AppComponent

  authentication/
    AuthenticationModule
    AuthenticationRoutingModule
    LoginComponent

  contacts/
    ContactsModule
    ContactsRoutingModule
    ContactListComponent

  users/
    UsersModule
    UsersRoutingModule
    UserEditComponent

  ...
Run Code Online (Sandbox Code Playgroud)

也许可以创建两个单独的路由空间(一个用于登录,一个用于应用程序的其余部分)并且仅将防护应用于应用程序部分的其余部分?


我希望有一个简单的解决方案.

提前致谢!

angular2-routing angular2-guards angular

9
推荐指数
2
解决办法
6592
查看次数