我正在尝试优化我的@Entity课程.让我们来看一个User <-> Group关系的常见情况.我还想存储建立关系的日期.表格布局:
USER GROUP_USER GROUP
------ ------------ -------
id user_id id
name group_id name
createdAt
Run Code Online (Sandbox Code Playgroud)
有以下3个类:
User 同 @OneToMany List<GroupUser>GroupUser用@ManyToOne User和@ManyToOne GroupGroup 同 @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) 简单场景:
我有多个服务实现了一个通用接口.所有这些服务都在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)
这有可能吗?
我有一个简单的contactList组件,它有2个绑定:contacts和onRemove.
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它永远不会undefined在contactList组件中.console.log(this.onRemove)总是打印:function(locals) { return parentGet(scope, locals); }
当然我可以使用另一种showRemove: '@'绑定,但这对我来说看起来并不干净.
你有任何想法或更好的解决方案来完成任务吗?
angularjs angularjs-directive angularjs-bindings angularjs-components
我有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回调那样的东西.我也试过onCompleted和onError,但这些不会太受被触发flatMapLatest.
有没有其他方法让这个工作?
谢谢!
示例:单个search()呼叫.
示例:search()并nextPage()致电.(在 search()响应返回之前调用nextPage().)
示例: …
我正在使用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.
有没有什么好办法使用一些配置参数来解决这个问题?
我正在使用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) 我有一个注册的组件/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?
我想实现一个自定义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?
有没有更好的方法来实现这一目标?/我使用了错误的拦截器吗?
我不想处理包装类,但我只想Page在beforeBodyWrite方法中使用普通的未修改对象.
我现在只是extend AbstractMappingJacksonResponseBodyAdvice.这很好用,但感觉不对.也许有人还有更好的主意.
这是以下代码Page -> Content-Range Header:
@ControllerAdvice
public class PageResponseAdvice extends …Run Code Online (Sandbox Code Playgroud) 我们当前的应用程序使用HTTP会话,我们希望将其替换为JWT。
该设置仅允许每个用户一次会话。这意味着:
之所以有效,是因为会话ID和用户ID之间存在服务器端关系。
我可以想象使用JWT在用户数据库中有一些计数器,每次登录时计数器都会增加,即:
现在,对于每个请求,我都必须检查传入的签名对于当前计数器值是否正确。
这使它有状态。:(
但是…… JWT的好处之一是,无需访问任何数据库或会话存储来验证令牌。
还有其他一些防止并发登录的解决方案吗?也许某些无需数据库访问就可以正常工作并使它保持无状态的东西吗?
我正在构建一个应用程序,对于未经身份验证的用户,根本无法访问.
我写了一个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)
也许可以创建两个单独的路由空间(一个用于登录,一个用于应用程序的其余部分)并且仅将防护应用于应用程序部分的其余部分?
我希望有一个简单的解决方案.
提前致谢!
angular ×3
spring ×2
spring-mvc ×2
angularjs ×1
dto ×1
hibernate ×1
httpresponse ×1
jackson ×1
jackson2 ×1
java ×1
java-time ×1
javascript ×1
jpa ×1
jwt ×1
many-to-many ×1
map ×1
observable ×1
rxjs ×1
service ×1
session ×1
spring-4 ×1
validation ×1